The open-source decision engine.

qbrix decides inside your request path and learns from every outcome, so traffic moves to what works.

Read the docs
helm install qbrix \
oci://ghcr.io/optiq-io/charts/qbrix \
-f values.yaml

Apache-2.0v0.2Python & TypeScript SDKsHelm or Docker Compose

Decide. Learn. Adapt. Every request runs the same loop: qbrix serves a decision from cache, learns from the outcome, and shifts traffic toward what's winning — continuously, not after a report.

FIG 0.1

Real-time adaptive

Traffic moves to what's working. No manual analysis, no waiting for significance — it self-adjusts in minutes.

FIG 0.2

Self-optimizing

qbrix reads your data and matches the best-fit algorithm to it — then keeps re-checking as it learns, switching automatically when your data shifts.

FIG 0.3

Personalized at request time

Per-user features choose the best variant. New visitors and power users see what works for them — not what works on average.

Decide inside the request

Your app sends the context; qbrix makes the call. Each request is evaluated against the latest parameters — a cached read, no database round trip, no model server — and the engine returns the variant most likely to perform.

1.0Decide
Incoming request
The context that travels with it.
{
id: "u_8241",
metadata.plan: "growth",
properties.device: "mobile",
properties.cart_value: 84.00,
properties.returning: true,
}
Reached the learner
in the 100% rollout · no override rule matched
The decision
Sampled from what each variant has earned so far, then served.
social-proofserved this request
76.4%6.42%Served
controlheld back
12.1%4.81%
urgency-copyheld back
8.4%4.02%
discount-badgeheld back
3.1%3.44%
qbrix.agent.select(experiment_id, context) → "social-proof"No model server

Learn from the outcome

Outcomes flow back and retrain the policy in real time. Report a click, a purchase, or a rating, and the next request sees updated parameters immediately.

2.0Learn
Event streamLive4,182 events in the last minute
19:42:08.412feedbacksocial-proof€84.00 purchase
19:42:08.396selectionsocial-proofp = 0.764
19:42:08.341selectioncontrolp = 0.121
19:42:08.288feedbackurgency-copybounced
19:42:07.984audit—cycle 1,284
19:42:07.902feedbacksocial-proof€61.50 purchase
19:42:07.844selectionsocial-proofp = 0.764
19:42:07.719selectionrelevance-boostp = 0.612
19:42:07.655feedbackrelevance-boostresult opened
19:42:07.601selectionthree-tierp = 0.526
19:42:07.548feedbackdiscount-badgebounced
19:42:07.470selectionguidedp = 0.384
19:42:07.412audit—cycle 902
19:42:07.366feedbackbenefitopened
Training cycle 1,284
500 events consumed · finished 4 minutes ago
Posterior update
social-proof
α 398 · β 5,812→α 412 · β 5,981
control
α 301 · β 5,943→α 310 · β 6,142
urgency-copy
α 216 · β 5,122→α 221 · β 5,278
The next request already sees this

Shift traffic toward what's winning

Traffic drifts to the winner as evidence accumulates — no freeze, no rerun. Exploration stays wide enough to be honest, narrow enough to stop paying for the losers.

3.0Adapt
3.1

Traffic moves on its own

The split changes as outcomes arrive — no deploy, no config change, nobody watching a dashboard. Yesterday's winner keeps the traffic only as long as it keeps earning it.

3.2

It adapts per segment, not just overall

The same experiment can settle on a different winner for mobile evenings than for desktop returners. A contextual policy finds those splits itself — you never write the rule.

3.3

Pin one and it stops choosing

Pause the experiment, or pin every visitor to a single variant, from the console. Allocation stops moving immediately and your callers keep getting an answer either way.

Every experiment, one screen.

Live reward rate, traffic allocation and the leading variant per experiment — watch qbrix converge from the console, no dashboards to babysit.

4.0Console
Experiments
ExperimentReward
checkout-ctacheckout · 4 variants
6.42%
search-rankingdiscovery · 6 variants
8.04%
pricing-pagepricing · 3 variants
4.18%
onboarding-flowactivation · 5 variants
2.90%
email-subjectlifecycle · 2 variants
5.11%
app-paywallmonetisation · 4 variants
3.62%
push-timinglifecycle · 3 variants
1.84%
home-herodiscovery · 4 variants
6.90%

Every decision, in the open.

Every selection, outcome, and policy switch — streamed the moment it happens. No black box, no nightly wait.

5.0Observability
Selections and reward · 14 days
checkout-cta
rewardselections
D1D2D3D4D5D6D7D8D9D10D11D12D13D14
Experiment summarylast 7 days
checkout-ctaWinner called

social-proof has held the lead since day 9.

Traffic is now 76.4%, up from an even split at launch.

search-rankingOn track

relevance-boost leads at 8.04% reward.

Still exploring at 41% allocation; no winner called yet.

onboarding-flowNeeds attention

No variant has separated after 12 days.

Consider adding a bolder variant or widening the gate.

Reward per visitor by variant
each dot is a 6-hour window · last 7 days
9.0%4.5%0.0%
social-proofcontrolurgency-copydiscount-badge

Integrate in minutes.

A handful of calls is all it takes to stand up a production-grade optimization system.

6.0Developer experience
$ pip install "qbrix[http]"
app.py
1from qbrix import Qbrix
2
3client = Qbrix(base_url="http://localhost:8000", api_key="optiq_...")
4
5experiment = client.experiment.create(
6 name="checkout-banner",
7 pool_id=pool.id,
8 policy="auto", # auto mode
9 policy_params={"reward_type": "binary"},
10)
Drop-in Python SDK

pip install "qbrix[http]" — one import, pointed at your own instance.

Sensible defaults

Auto mode selects and tunes the right policy for you. Opt-in to advanced control when ready.

REST or gRPC

Full HTTP REST API and gRPC stubs — pick what fits your stack.

View API reference

Built for production.
Designed to disappear.

Run it on your own machines and forget it's there. It answers from memory, changes without a deploy, and keeps your data where the rest of your data already lives.

7.0Product
0training in your request path

Fast by design

Decisions come from an in-memory cache, served by stateless replicas that scale with your traffic. Learning runs as a separate service on its own clock, so nothing in your request ever waits for it.

0deploys to change or stop it

Always reversible

Pause an experiment or narrow a rollout from the console and callers keep getting your default variant. Turning it off is a setting, not a release.

0calls home

Your data stays yours

Selections, outcomes and experiments live in your own Postgres and Redis — and ClickHouse, if you turn analytics on. No telemetry, no license check.

Open source.
Or run by us.

qbrix is Apache-2.0 and the version you run yourself is the whole product, with no limits. If you'd rather not operate it, we host it for you.

8.0Run it
Self-hostedFree

Run qbrix on your own machines, under the Apache-2.0 license.

  • The whole product: API, console, feature gates and analytics
  • No usage limits, seat caps or license key
  • Docker Compose on one machine, or Helm on Kubernetes
  • Community support through GitHub issues
Read the self-hosting guide
ManagedTalk to us

We run qbrix for you, in the EU, sized to your traffic.

  • The same product and the same API as self-hosted
  • Upgrades, backups and monitoring are ours to do
  • Support directly from the team that builds qbrix
  • Contract and invoice with Optiq B.V., under Dutch law
Email us