alpha · still moving Vortex is pre-1.0. What’s on this page today is the truth for today — expect these screens to drift as it does.
Vortex Docs

From an OpenAPI spec to a verdict you can defend.

What to install, the ideas Vortex is built on, and the actual screens you’ll use — illustrated with real screenshots from a running instance, not mockups. About a five-minute read for the tour itself.

What you need on your end

Two things are required. Two more unlock more of the product, but Vortex runs without them. Vortex checks all four itself — this is its own status bar, once every light is on:

Get it running

No build, no installer, no account. Three steps, and the third one is optional.

  1. Download

    One file. No installer, no package manager.

    vortex.jar
  2. Run it

    java -jar vortex.jar — loopback only, nothing leaves your machine.

  3. Open it

    http://127.0.0.1:7717 in a browser. That’s the whole install.

The mental model

One Service. A Workload it actually has to survive. An Evaluation asking whether it did. A Quality gate deciding what counts as “did.” One Run to find out. Evidence at the end of it — not just a number.

Service

The one system under test. Vortex measures one at a time.

Workload

A traffic condition — rate split across operations, held for a duration.

Evaluation

The performance question a run answers — not “which workload,” but what you’re trying to learn.

Quality gate

The objectives a run has to hold — p95 latency, p99 latency, error rate.

Run

One immutable execution, kept with the exact workload it applied.

Evidence

What happened, plus the conditions it happened under — not just a number on its own.

The five-minute tour

Real Vortex Workbench · Actual local screens

From the demo service that ships with Vortex, to a workspace you’ll come back to — the same ten steps every service goes through.

1
Add your service

Creation is a separate act from configuration — a name is all that’s required. A repository path is optional; a service tested remotely never needs one.

The Add service form: an optional service location field, a required service name, an optional API definition URL, and an optional description
2
Import its OpenAPI document

Paths, methods, and schemas are parsed deterministically — no AI involved. Operations that write data are flagged for review before anything can send traffic to them.

A service definition discovered from an OpenAPI import: GET /accounts/{id} marked read-only, and two POST operations flagged Review data
3
Say what each request needs

Every field a write needs gets a value source: fixed, generated, a dataset column, or an environment variable. Here, an order’s account id is a generated UUID and its amount is a fixed value.

The request data drawer for POST /orders: accountId set to Generated (a random UUID, every request), amount set to Fixed at 42.50
4
Define what you want to test

Pick an intent — Smoke, Average load, Stress, Spike, Soak, or Breakpoint, each phrased as a question — then a total arrival rate or concurrency and a duration. The operation mix and its share of traffic stay visible as you go.

Composing a test: Average load selected among six intents, a 50 req/sec arrival-rate load over 10 minutes, and the target Docker image
5
Set objectives

The quality gate a run has to clear — p95 latency, p99 latency, error rate. Saving always replaces the whole set, so a blank field drops that objective rather than silently keeping whatever was there.

Expectations: p95 latency below 200 ms, p99 latency below 500 ms, error rate below 5%
6
Check the preflight

A plain-English summary of exactly what’s about to happen — the target, the operation mix, the environment classification, and every condition that has to hold for a pass. Nothing is sent yet.

Preflight for Average load: 80 requests/sec for 3 minutes, the operation mix, isolated-test classification, and a full pass-conditions checklist all green
7
Run it

Target, actual, p95, and error rate update every five seconds while k6 runs the workload for real — no simulated progress bar standing in for it.

A live average-load run in progress, target versus actual throughput and p95 latency updating, with a cancel-run control
8
Read the result

A one-line answer first, then a verdict, an evidence-quality label, and the headline numbers — throughput, p95, error rate, resource use, and whether capacity was actually established. Every claim traces back to a measurement.

A spike run's result: Pass verdict, Valid evidence quality, and headline tiles for p95, error rate, load, resource use, and capacity
9
Optionally, ask for AI interpretation

A local model can read the same evidence and explain it in plain language — it never determines pass/fail, and everything it claims has to cite a measurement or it’s discarded. Skip it entirely and the run is exactly as valid.

An AI interpretation panel reading the run's evidence: findings on latency and pool utilization, a recommended next test, generated locally with Ollama
10
Come back to your workspace

Every service has one: production peak and a status chip per test kind up top, each test expandable to its last result without leaving the page — here, a breakpoint run showing exactly where objectives stopped holding.

A service's workspace: production peak and six test-kind status chips up top, and a breakpoint test expanded to its last result — a Fail verdict, the boundary between 132 and 176 requests/sec plotted on a number line against production peak, percentile latencies, a red-highlighted objectives table, and container resource usage at its limit

Establish a production baseline

Separate from the ten steps above, and worth doing for any service that has real users: give Vortex something to compare a workload against, on the service’s Production reality panel.

Is it live yet?

Connect once, under Settings — one endpoint for the whole workbench. Vortex spawns npx mcp-remote locally, which handles Dynatrace’s own sign-in once; the session is reused after. Each service then points at it independently: search by name, or paste the entity id directly. Only throughput, latency, and error-rate queries travel to Dynatrace — never a request to interpret or summarize anything.

Settings — connect Dynatrace once

An endpoint, a default observation window, and local-bridge sign-in — configured once for every service that opts into it.

Settings page's Dynatrace MCP card: an endpoint field, a default 30-day observation window, local bridge mode explained, Save and Test connection controls

What makes it trustworthy

A green k6 exit code just says a script finished. Here’s what actually backs a Vortex verdict — five claims, and what each one refuses to be.

A cloud dashboard you don’t control.

A workbench that runs on your machine.

Against your services — no account, nothing leaves.

A model’s opinion.

Ordinary code.

Verdicts, breakpoints, and headroom, computed from what your run measured — the same evidence always yields the same conclusion, on any machine. (The raw numbers themselves still depend on the machine that produced them — a faster box runs a faster test. It’s the logic that never moves.)

An unverifiable claim.

A finding that cites its evidence.

Every AI finding names the measurement behind it, or it gets discarded before you ever see it.

An invented number.

Traffic you actually observed.

Headroom is established tested capacity divided by observed production peak. If the two aren’t comparable — wrong units, an isolated test, no capacity actually established — Vortex refuses to produce a number rather than guess.

An overclaim.

“Not established by this test.”

Treated as a valid, honest answer — and Vortex will say it plainly when that’s the truth.

One file, shared by the whole team

A different kind of trust than the last section’s — not about the verdict, but about whether the test itself outlives the person who built it.

Not a setting saved to your machine. A file saved to the repo.

Every operation, workload, and objective you define lands in one plain-text file, .vortex/vortex.yaml, next to the service it describes. Commit it, and a teammate — or CI — runs the exact test you did. Not their memory of it.

.vortex/vortex.yaml
$ cat .vortex/vortex.yaml
workloads:
  average-load:
    type: AVERAGE_LOAD
    shape: { rate: 80, duration: 3m }
    operations:
      createOrder: 20
      getOrder: 30
      getAccount: 40
Can it handle production?
Boss
Tested to 3× the observed peak. Every objective held.
Engineer
ENG Probably. Not this time.

Not a guess anymore — a verdict you can defend.