An argument about what a platform actually is

A workflow automation platform is 11 lines of dispatch. Everything else is the editor.

Every other page about workflow automation platforms ranks vendors by integration count and chart-of-accounts coverage. None of them open the runtime. The runtime is the thing that picks which of two workflow languages to run, where to load the workflow's source from at execute time, and how many machines run it in parallel. In Mediar's open-source executor crate, that decision is one if-else and eleven lines of Rust. They are the spine of the platform, and reading them is the closest thing to reading the contract you sign when you buy one.

M
Matthew Diakonov
11 min

Direct answer (verified 2026-04-29)

A workflow automation platform is a runtime that defines, schedules, executes, and monitors automated workflows across multiple systems and machines. It includes a workflow shape, a queue, an executor, and a transport. Mediar's open-source runtime is the crates/executor axum service in the open-source Terminator monorepo, which dispatches a queued workflow row to either a TypeScript or YAML executor based on a single preferred_format column. Source verified at github.com/mediar-ai/terminator.

The 11 lines

The dispatch sits in crates/executor/src/services/queue_processor.rs, inside the closure that runs against a leased execution row. After the queue processor has resolved an MCP endpoint and started a 600 second tokio::time::timeout (line 194), it does this:

// queue_processor.rs lines 201-211
if workflow.preferred_format.as_deref() == Some("typescript") {
    WorkflowQueries::update_execution_progress(
        db_pool, execution.id, 0, 1,
        Some("Executing TypeScript workflow".to_string()),
    ).await?;

    let ts_executor = TypeScriptExecutor::new(
        db_pool, &mcp_client, &workflow, &execution
    ).with_cancellation_token(cancellation_token.clone());
    ts_executor.execute().await
} else {
    let yaml_executor = YamlExecutor::new(
        db_pool, mcp_client, &workflow, &execution
    ).with_cancellation_token(cancellation_token.clone());
    yaml_executor.execute().await
}

That is the platform. The rest of the runtime, hundreds of files across the desktop agent, the web app, the modal services, and the recorder, exists to feed those 11 lines a row that they can decide what to do with. A buyer who wants to know what a platform actually is should read this block first and the visual studio second.

The two shapes the platform accepts

The dispatch above is only meaningful because the platform accepts two distinct workflow shapes on the same execution path. One is a flat YAML document the recorder produces and an analyst can edit by hand. The other is a TypeScript file an engineer writes when a step needs real control flow. Both end up calling the same MCP step primitives.

One row, two languages

# A YAML workflow row
# (loaded inline from {github_folder}/workflow.yaml via octocrab)

steps:
  - tool_name: open_application
    arguments: { name: "saplogon.exe" }
  - tool_name: type_into_element
    arguments:
      selector: { role: "edit", name: "Vendor" }
      value: "{{ inputs.vendor_id }}"
  - tool_name: click_element
    arguments:
      selector: { role: "button", name: "Post" }
    on_error: retry
    retry_count: 2

inputs:
  vendor_id: { type: "string" }

stop_on_error: true
cron: "0 9 * * 1-5"
-30% MCP tools shared across both

The thing to notice is not that one is shorter. The two formats target different authoring populations. A platform that locks every author into one syntax has chosen one population; a platform that dispatches between two has chosen both. The runtime contract that makes the second choice possible is the eleven lines above plus the two executor structs whose names appear in them.

Where the source code physically lives

The dispatch picks an executor; the next decision is where that executor goes to find the workflow it is about to run. The platform has two source loaders, one per format, and both rely on GitHub as the system of record.

  • TypeScript workflows live as a packaged release on a private GitHub repo and are downloaded by uuid through app.mediar.ai/api/workflows-uuid/download?uuid=<uuid>, with an MCP_SERVICE_TOKEN on the request. The release artifact is unpacked to a per-uuid folder before the executor runs it. The row carries a github_release_url and a github_release_checksum so the runtime can verify the bytes it executes match the bytes shipped.
  • YAML workflows are fetched inline by the GitHubLoader in services/github_loader.rs, which uses octocrab to GET {github_folder}/workflow.yaml at a pinned github_ref. The base64 content from the GitHub Contents API is decoded into a string and parsed by the YAML executor.

Both loaders converge on the same thing: an in-memory WorkflowSequence struct that the executor walks step by step. Workflow source in this system is a git artifact, not a vendor blob. That is what allows a workflow to be reviewed, diffed, branched, and rolled back the way everything else in engineering is.

THE PLATFORM, IN FIVE LAYERS

1

1. Workflow row

Postgres row with a preferred_format column

2

2. Queue

QueueProcessor pulls pending executions

3

3. Dispatch

11-line if-else picks TS or YAML executor

4

4. Source

GitHub release zip or {folder}/workflow.yaml

5

5. MCP

execute_sequence on localhost:3000

Concurrency, machine identity, and the per-execution clock

Above the dispatch sit three runtime constants that decide how many workflows actually run at once and what stops them. They are the numbers that show up at three in the morning when a queue backs up, and they are configuration, not pricing tiers.

MAX_CONCURRENT_EXECUTIONS
Tokio Semaphore size in QueueProcessor. Reads the env var of the same name; falls back to 10. Each permit corresponds to one in-flight execution on this worker.
Per-execution timeout
Duration::from_secs(600) wrapped around the dispatch in tokio::time::timeout at line 194. Ten minutes, not configurable per workflow today.
Machine ID
hostname-{uuid} generated at start, used to lease a row to one and only one worker. Scaling out is more workers, not a bigger box.

The shape of these three constants is the shape of every platform conversation a buyer ends up having: how many in flight, how long before a stuck one is killed, who is the node of record. Naming them in a public file rather than a sales deck is the difference between owning the runtime and renting it.

WHAT MAKES A RUNTIME A PLATFORM

  • Workflows are stored as rows, not as files locked inside a vendor IDE.
  • The runtime accepts more than one workflow shape on the same execution path.
  • Source code for a workflow lives in source control, not in a hidden vendor blob.
  • A queue lets a single worker pool serve every team in the org without per-seat licensing.
  • The transport that carries a step (MCP) is documented and reusable, so the same step can be called by a workflow, a chat agent, or a script.
  • Concurrency, machine identity, and per-execution timeouts are configuration, not pricing tiers.
$0.75/min

Runtime is billed at $0.75 per minute of execution. There is no per-seat license, no per-bot license, no per-process license. A workflow that runs for 30 seconds costs about 38 cents whether one user kicked it off or fifty did.

Mediar pricing, current as of 2026-04-29

What this means for buyers

A buyer who has been quoted $500K for a UiPath, Power Automate, or Automation Anywhere implementation is buying three things in one line item: a recorder, an editor, and a runtime. The recorder and editor are visible; you can see them in the demo. The runtime is the layer that actually decides whether the workflow runs at noon on a Tuesday three months from now when no one is watching, and the runtime is what nobody walks you through. That is the layer this page has been opening.

The same buyer asking honest comparison questions about Mediar should ask: where is the dispatch, what languages does it accept, where does workflow source live, what is the per-execution timeout, how is concurrency limited, and what transport carries a step. All six answers for Mediar are above and verifiable in the open-source repo. The same six questions about a proprietary platform get answered behind an NDA, if at all.

We moved one F&B chain from UiPath to Mediar; their CFO told the board they are now saving 70% on costs. Claims intake at one mid-market insurance carrier went from 30 minutes per claim to 2 minutes, which is $750K per year on AP-team headcount math. Bank onboarding at one regional core went from 8 weeks to 2 weeks. None of those numbers are press-release numbers, and none of them were unlocked by a bigger feature list. They were unlocked by the runtime being small enough that an engineer could read it on a Saturday and extend it without filing a vendor ticket.

See your workflow run on this runtime in 30 minutes

Bring one process you already do by hand, or one that stalled in your existing RPA tool. We will walk you through the dispatch and the cost math against your current quote.

Frequently asked questions

What is a workflow automation platform, in one paragraph?

A runtime that defines, schedules, executes, and monitors automated workflows across multiple applications and machines. It includes a place to author workflows (a recorder, an editor, or both), a place to store them (rows in a database, files in source control, or both), a scheduler that decides when each one fires, an executor that drives the actual clicks and typing, and a queue that distributes executions across worker machines. A platform is the runtime, not the editor that ships next to it.

What concretely makes Mediar a 'platform' and not a tool?

Three things, all visible in the open-source executor crate. First, a workflow row carries a preferred_format column, and the queue processor's dispatch at queue_processor.rs lines 201 through 211 picks between a TypeScript executor and a YAML executor based on that single string. Second, workflow source can come from two places: a GitHub release zip downloaded by uuid for TypeScript workflows, or a workflow.yaml file fetched inline from a GitHub folder for YAML workflows. Third, every execution shares one MCP endpoint, one 600-second per-execution timeout (line 194), and one MAX_CONCURRENT_EXECUTIONS semaphore (defaulting to 10) so a single worker pool serves every team. None of those three things are user-visible features; they are the runtime contract that lets the user-visible features compose. That contract is what a platform is.

Why does the platform support two workflow languages instead of one?

Because they cover different authoring populations. YAML is what the recorder produces and what an analyst can hand-edit; the steps array, the on_error and retry_count fields, the cron string, and the typed inputs map are all serializable in 30 lines per workflow. TypeScript is what an engineer reaches for when a workflow needs branching, retries with bounded backoff, structured error handling, or a real loop. Both are first-class on the same runtime: the queue processor calls TypeScriptExecutor::new or YamlExecutor::new without making the rest of the system care which one ran. A platform that locks you into one syntax forces every author into that one syntax; this one does not.

Where does a workflow's source code physically live at execute time?

Two paths, picked by format. TypeScript workflows live as a packaged release on GitHub and are downloaded by uuid through https://app.mediar.ai/api/workflows-uuid/download?uuid=<uuid>, with an MCP_SERVICE_TOKEN in the request header. The desktop agent unpacks the zip into a per-uuid folder under the workflows directory before the executor runs it. YAML workflows are fetched inline by the GitHubLoader at services/github_loader.rs, which uses octocrab to GET {folder}/workflow.yaml at a pinned git ref. The legacy github_folder field on the workflow row points at that folder; the new uuid field plus a github_release_url and a github_release_checksum point at the release artifact. Both paths land in the same MCP execute_sequence call.

How many concurrent workflow executions does a single machine handle?

Ten by default. The QueueProcessor at services/queue_processor.rs reads a MAX_CONCURRENT_EXECUTIONS environment variable, falls back to 10, and gates execution on a tokio Semaphore of that size. Each running execution holds one permit until it returns, fails, or hits the 600-second per-execution timeout (line 194). The machine identifies itself with hostname-{uuid} (line 256), which is what the queue uses to lease a row to one and only one worker. Scaling out is more workers, not a bigger box: the same code on a second machine picks up an unleased row and runs it.

What is the MCP endpoint and why does the platform talk through it?

MCP is the model context protocol; the executor talks to a local server on http://localhost:3000 by default (configurable via MCP_ENDPOINT or the execution row's mcp_endpoint field). Every step in either workflow language eventually becomes a tools/call with a tool_name like open_application, type_into_element, or click_element. The reason the platform talks through MCP is that the same set of step primitives can be called by a workflow, a chat agent, or a one-off script with no glue code: there is one transport for all three. The transport also makes the executor trivial to swap; nothing in the queue processor cares whether the MCP server runs the desktop agent, a Windows VM, or a remote runner.

Can workflows be partially re-executed, or is it always start to end?

Partial. The WorkflowSequence model in models/workflow.rs has explicit start_from_step and end_at_step fields, plus a follow_fallback flag and an execute_jumps_at_end flag. The intended use is debugging or recovery: re-run a workflow from the step where it failed, or stop at a checkpoint and inspect state, without rebuilding the run from scratch. This is policy, not preference; vendor RPA platforms usually expose a 'rerun from step' button as a UI affordance but bake nothing into the workflow row itself, so a script that calls the platform programmatically cannot use it.

What stops a stuck workflow from holding the desktop hostage?

Three timers. First, the per-execution wall clock: 600 seconds in the queue processor's tokio::time::timeout call. If a workflow takes longer than that, the executor's future is dropped and the execution is recorded as a timeout. Second, the desktop scheduler's MAX_SCHEDULED_EXECUTION_SECS at workflow_scheduler.rs line 161, hard-coded to 30 minutes, which terminates a long-running scheduled run via stop_mcp_execution. Third, the SSE buffer cap at MAX_SSE_BUFFER (10 megabytes), which stops a chatty execution from filling memory. None of the three are configurable per-workflow today; they are runtime policy.

How does the platform compare to UiPath, Power Automate, and Automation Anywhere on this dimension?

UiPath, Power Automate, and Automation Anywhere are platforms in the same sense: they have a runtime, a queue, a workflow shape, and a way to dispatch a row to an executor. The differences are in what the runtime is willing to expose. Mediar's runtime is open source under github.com/mediar-ai/terminator, which means the dispatch, the source loaders, the timeout constants, and the MCP transport are readable. The proprietary platforms ship the same primitives in compiled form behind a license. Honest answer about coverage: where the proprietary platforms invest more is in the visual studio that authors workflows; where Mediar invests more is in keeping the runtime small enough that an engineer can read it on a Saturday and an ops lead can extend it without filing a vendor ticket.

How is this priced compared to per-bot or per-process licensing?

Runtime is billed at $0.75 per minute of execution. There is no per-seat license, no per-bot license, and no per-process license. The $10K turn-key program fee converts to credits with a bonus and is effectively prepaid usage covering the first pilot, including the porting of an existing UiPath or Power Automate workflow. A workflow that runs for 30 seconds costs about 38 cents whether one user kicked it off or a queue of 50 users did. The pricing follows the runtime contract: minutes of executor time, not seats of authoring tool.