Unmeshed vs Netflix Conductor

We built Netflix Conductor. Here's what we built next.

Conductor OSS has stalled. Unmeshed is its successor, built by the same people, with the same core concepts and terminology you already know. Most teams migrate in weeks, not quarters.

Free tier · No credit card required

By the creators of Netflix Conductor

Why Teams Move

Why teams are moving.

OSS momentum stalled

Conductor's open source project has lost its momentum. It's just not moving the way it used to. That leaves your orchestration layer resting on a core that's stalled out, a bet most platform teams aren't willing to make.

Predictable pricing, no per-action fees

Your bill shouldn't climb just because your workflow volume did. Unmeshed pricing stays flat and predictable, with no per-action fees, and you can start on the free tier without a credit card.

Modern platform

One engine runs both your workflows and your AI agents. It's MCP-native, schedules on a standard cron down to one-minute intervals, and keeps execution durable, with a human brought in whenever a step needs approval, all backed by full observability.

Concept Mapping

You already know how Unmeshed works.

The concepts you use every day in Conductor have direct equivalents in Unmeshed, usually with a shorter name.

Netflix ConductorUnmeshedWhat changes
WorkflowProcessSame idea: a definition that orchestrates your steps end to end.
TaskStepWorkers poll and execute, exactly as they do in Conductor.
DecisionSwitch CaseBranching with simpler, script-driven case mapping.
taskReferenceNamerefStep references get a shorter name in the definition schema.
${...}{{ ... }}Variable references use a familiar template syntax.

Platform Comparison

An honest look at your options.

Every team weighing Conductor OSS, Orkes, and Unmeshed is asking the same questions. Here's how each platform approaches them.

CapabilityConductor OSSOrkesUnmeshed
Maintained by Conductor's original creatorsCommunity-maintained; no longer driven by the original Netflix teamFounded by members of the original Conductor teamYes. Built by the people who built Netflix Conductor.
Hosting optionsSelf-hosted only; you operate, scale, and patch itManaged cloud, with enterprise deployment optionsManaged cloud or self-hosted. Same engine, either way.
Pricing approachFree software; total cost is your infrastructure and engineering timeCommercial plans; see Orkes pricing for current modelsPredictable pricing, no per-action fees; free tier to start
SchedulingPoll-based scheduling; latency depends on tuning and deploymentManaged Conductor runtime; see Orkes docs for scheduling characteristicsStandard 5-field cron scheduling, down to one-minute intervals, built into the engine.
MCP / AI-agent orchestrationNot a core feature of the original projectOffers AI orchestration capabilitiesMCP-native, with workflows and AI agents running on the same engine.
Human-in-the-loopSupported via the HUMAN task typeSupported through human task featuresBuilt in. Pauses for approvals and resumes on its own.
Migration toolingN/A, this is the platform most teams are migrating fromRuns existing Conductor definitionsDocumented concept mapping, familiar SDKs, guided migration support

This table describes each platform's approach in neutral terms based on public information. Spot something out of date? Tell us and we'll correct it.

Worker Code

Your workers barely change.

Your worker code barely changes. It's the same poll-and-execute model and the same shape. Register your function against a step name, and let the engine handle the rest.

Netflix Conductor

conductor_worker.py
from conductor.client.automator.task_handler import TaskHandler
from conductor.client.configuration.configuration import Configuration
from conductor.client.worker.worker_task import worker_task

@worker_task(task_definition_name="charge-order")
def charge_order(order_id: str) -> dict:
    # your business logic
    return {"status": "CHARGED", "order_id": order_id}

task_handler = TaskHandler(configuration=Configuration())
task_handler.start_processes()

Unmeshed

unmeshed_worker.py
from unmeshed.sdk.configs.client_config import ClientConfig
from unmeshed.sdk.unmeshed_client import UnmeshedClient
from unmeshed.sdk.apis.workers.worker import Worker

def charge_order(input: dict) -> dict:
    # same business logic, same poll-and-execute model
    return {"status": "CHARGED", "order_id": input["order_id"]}

client = UnmeshedClient(ClientConfig())
client.register_worker(
    Worker(execution_method=charge_order, name="charge-order")
)
client.start()

Migration Path

A migration path, not a leap of faith.

Map definitions

Translate your workflow JSON into Unmeshed processes with the documented concept mapping. Most fields already line up.

Port workers with familiar SDKs

Keep your poll-and-execute model as is. Just re-register your task workers as Unmeshed steps in Java, Go, Python, or TypeScript.

Cut over with parallel runs

Run both engines side by side, compare outputs on real traffic, and move over once the numbers agree.

First workflow running in minutes; typical migrations land in weeks.

FAQ

Frequently asked questions

Bring your Conductor workflows home.

Free tier · No credit card required