Self-hosted Runner

Your data never leaves your infrastructure

Runner is a Docker container that runs inside your servers, processes experiment CSV files locally, and sends only aggregated statistical results to AB-Labz — no user IDs, no raw data.

Architecture

Compute stays on your side

The Runner polls the cloud for tasks, reads your local CSV files, runs the statistical engine, and returns only the numbers — never the source data.

Your servers
CSV files
homepage_test.csv
checkout_v2.csv
onboarding_flow.csv
Read-only mount · never leaves your perimeter
Your infrastructure
AB-Labz Runner
Polls tasks on schedule
Runs the statistical engine
Aggregates results locally
AB-Labz
Cloud
p-value, CI, effect size
Aggregated group means
User counts per variant
SRM analysis
Displays in workbench UI
In the workbench

Managed from the same interface

Once connected, the Runner appears in the workbench alongside your experiments. Key status, last activity, discovered files — all visible without touching the server.

workbench.ab-labz.com

Self-hosted Runner

Key Regeneration
Attention!

Old key will stop working after regeneration

Key Prefix
abn_runner_aAnz-*** Offline
Name Prod Runner
Created 24.07.2026 08:54
Last Seen Never
Runner Installation
Available Experiments

No experiments found

Place CSV files in the experiments folder

Privacy

What crosses the boundary

The Runner sends only derived numbers to the cloud. Raw data, user identifiers, and individual records never leave your servers.

Data type
Sent to cloud
Never sent
p-value, CI, effect size
Statistical test results
Aggregated group metrics
Mean values and conversions by variant
User counts per variant
Counters only — no identifiers
SRM check results
Traffic split analysis
Raw CSV files
Source experiment data
user_id identifiers
Stripped locally before any upload
Any PII
Email, phone, IP — stays on-prem
Setup

Four steps to connect

You get a zip archive with the Docker image, compose file, and config. Point it at your CSV folder and start.

1
Create a Runner key
In the workbench, go to Runner → Create Key. Copy it — shown only once.
2
Unpack the archive
You receive runner-client-v1.x.x.zip with the Docker image, compose file, and config.
3
Set your key and data path
Add the key to .env and point docker-compose.yml at your CSV folder.
4
Load the image and run
docker load the image, then docker-compose up -d. Status appears in the workbench immediately.
Full setup documentation

docker-compose.yml + .env

services:
runner:
image: ab-labz-runner:v1
env_file: .env
volumes:
# path to your CSV files
- /data/experiments:/data/experiments:ro
restart: unless-stopped
# .env
API_URL=https://workbench.ab-labz.com
RUNNER_KEY=abn_runner_xxxxxxxxxxxxxxxx
Automation

Update the file — results follow

Runner watches the CSV folder every 5 minutes. The moment it sees a file change, it queues a re-analysis — everything stays current without any manual work.

You update the CSV
Append new data to the experiment file
Runner detects change
Watches mtime every 5 min — configurable
Re-runs analysis locally
Full statistical engine, same as cloud mode
Results in workbench
Sample size, SRM, forecast — refreshed
Poll interval: 60 seconds
File check: every 5 minutes
Mount: read-only
What unlocks

Live monitoring on the dashboard

Experiments processed by Runner appear on the dashboard with live monitoring — updated automatically every time Runner re-analyses the file.

  • SRM check — traffic split correctness verified on every run
  • Sample accumulation — see how far you are from the target sample size
  • Win probability forecast — Bayesian estimate updated with each new dataset
workbench.ab-labz.com
Active Experiments
AB Reduce steps in guest checkout flow
✓ SRM
ab-123xpt-ddw
CR Reg +5%
Success forecast 78%
Sample size 6 151 / 20 000
31% collected
Time left: 3 days
Data layer

One data mart — all experiments

The recommended pattern: build a single wide mart in your own infrastructure, then automate the slice-and-deliver step. AB-Labz receives clean per-experiment CSV files — whether via Runner folder or API push.

1
Build a single data mart

One wide table in your DWH — all experiments, all metrics, all segments, updated daily.

-- schema
dt | experiment_id | user_id | variant
| metric_1 | metric_2 | ...
| segment_1 | ...
2
Slice per experiment on a schedule

A nightly job queries the mart for each active experiment and exports the full dataset from day one to today.

# runs nightly
for exp_id in get_active():
df = query("SELECT * FROM mart
WHERE experiment_id=?", exp_id)
deliver(exp_id, df) # API or Runner
3
Deliver via API or Runner folder

API: POST the CSV file.
Runner: drop it into the watched folder.

AB-Labz picks it up, runs the analysis, and updates the dashboard.

Single source of truth

All experiments share the same metric definitions — conversions, revenue, segments calculated once, consistently.

New experiments appear automatically

New experiment_id in the mart → next run delivers it. Just add the ID to the hypothesis card in AB-Labz.

Ratio metrics handled correctly

Store orders and revenue, not aov. The engine aggregates ratios correctly.

Available on Corporate Self-hosted

Includes Runner, API integration, and the full team workspace. Write to us if you'd like to learn more.