Skip to main content
Mixpeek runs in three shapes. They differ in one dimension: how much of the stack you own. The API, the SDKs and the primitives are identical across all three, and code written against one runs unchanged against the others. This page names who owns what, so a security review can answer its questions without a call.

The ownership ladder

There are two products behind those three rows. The third row is the one with a boundary worth drawing, and it sits in exactly one place: You provide the substrate. Mixpeek provides and operates the software. Both planes move together. In customer-hosted Mixpeek the data plane and the compute plane are in your environment: MVS shards on your disks, Ray on your nodes, your object storage. That is the whole point, and it is why we do not offer a shape that moves only one of them.
The test this architecture is built around: can Mixpeek upgrade itself without asking your platform team to upgrade a dependency first? Because we ship our own Ray, Python, CUDA and MVS as containers, mostly yes. Your Kubernetes version, storage capabilities and GPU drivers remain a compatibility boundary, but that is a much smaller and slower-moving interface than one where our release cadence depends on your runtime.

The vector store, in every row

Every row above stores vectors in Mixpeek Vector Store on object storage. That is what we run, in all four models. Your vectors live in object storage in the row’s data plane, not in a separate database you have to operate. In customer-hosted Mixpeek, MVS runs in your Kubernetes, on your disks. It is Mixpeek software, operated by Mixpeek, running on substrate you provide. Your vectors do not leave your environment. MVS is a separate service rather than a Ray workload, deliberately: owning the storage layer end to end is what makes the learned index possible. That is why it moves with the rest of the plane rather than being something you host separately. Mixpeek Vector Store is the vector store in all three shapes. Bringing your own vector database is not a deployment we offer, because owning the storage layer end to end is what makes the learned index possible.

What changes, and what does not

On both Mixpeek Cloud rows the control plane stays with Mixpeek: the API gateway, auth, billing, and the routing that sends your requests to the right data plane. What moves is where the work runs and whose hardware it runs on. Customer-hosted is the row where that is a choice. The managed shape keeps the control plane with Mixpeek and your namespace egresses to it; a fully self-hosted install keeps it in your namespace and needs no outbound to us. The boundary section of the data-flow page gives the six collections involved and what the self-hosted shape gives up.
Your integration does not change between models. The same buckets, collections, extractors, retrievers, taxonomies and clusters, the same API keys, the same SDKs. Moving down the ladder changes your infrastructure obligations, not your code.

BYO Ray, in more detail

BYO Ray is the row where the most is yours, so it is the row with the most to say. You already run Ray or KubeRay. Mixpeek runs its indexing and inference workloads on it rather than asking you to stand up a second one. What you grant. One Kubernetes namespace, and two namespace-scoped Roles inside it. Nothing of ours is cluster-scoped: no ClusterRole, no CRDs of ours, no ability to create namespaces. The one exception, stated rather than buried. KubeRay is cluster-scoped: it ships 3 CustomResourceDefinitions and 5 ClusterRoles, and there is no namespace-only way to install it. Most customers already run it, and where they do not, their platform team installs it once with a Helm command we publish. If you would rather we owned that too, the grant is customresourcedefinitions + clusterroles + clusterrolebindings, and the qualification suite reports which side of that line you are on. Both are supported; the difference is whether a Mixpeek release needing a newer KubeRay waits on your change window. What stays yours. Your node pools, quotas, taints, autoscaler policy and network policy. Mixpeek’s workloads schedule under your rules; they do not change them. What we deploy. Our engine image into that namespace, and ephemeral batch jobs into the same namespace. A Ray cluster runs one image, so where we bring our own cluster your Ray, Python and CUDA versions are not inputs to whether it works. We bring our own Ray. Mixpeek deploys a RayService into your namespace with our image, our Serve applications and our worker groups, and submits batch as RayJobs into the same namespace. Your Ray, Python and CUDA versions are not inputs to whether it works, because a Ray cluster runs one image and that image is ours.
If you already run Ray, we still bring our own rather than joining yours. That is deliberate. Running Mixpeek inside your Ray runtime would make your Ray, Python and CUDA versions a dependency of our release cadence, and would mean qualifying a new build per customer environment.Running Mixpeek on an existing customer RayCluster is possible and we have measured what it involves, but it is a compatibility exception rather than the supported shape. Ask if you need it.

Serve isolation on a shared cluster

If you run Mode 2, Mixpeek’s Serve applications sit beside yours on a cluster you own. How we deploy them depends on how yours were deployed, and the difference is worth understanding before you grant access. Ray Serve’s configuration API is declarative over the whole application set: a config that does not name an application removes it. Whether that reaches your applications depends on whether Ray Serve holds a config for them. You can tell which you have: an application with an empty deployed_app_config in GET /api/serve/applications/ was deployed imperatively, and sits outside the lifecycle that config governs. Mixpeek does not use the whole-config path on a cluster it does not own. We add, scale and remove one named application at a time, which cannot reach another application regardless of how yours were deployed. For customers whose Serve apps are declaratively deployed, that is protection against a real and measured hazard rather than a precaution.
Measured on Ray 2.53.0 with KubeRay 1.5.1, on a single-head cluster with one application of each kind. It is enough to state the asymmetry above. It is not a promise that a whole-config deploy is safe on your cluster, and we do not make one.

Qualifying your cluster

Before anything is deployed, Mixpeek runs a qualification suite against your Ray cluster and hands you the report. It checks reachability, the namespace-scoped permissions, connectivity to your object storage and control-plane endpoints, whether your node pools, taints and quotas remain authoritative when we schedule, and whether our workloads leave your existing Ray applications, jobs and actors untouched. The report is a plain-text table of rows and verdicts. Rows that could not be run say so rather than passing quietly, and a row that cannot establish something reports what it could not determine rather than reporting an absence.

Choosing a model

  • Mixpeek Cloud if you want none of this. Most customers.
  • Mixpeek Cloud, dedicated if you need isolated capacity but not custody.
  • Customer-hosted if your data must stay in your environment, or your security posture requires that the software run on infrastructure you control.
Already running Ray or KubeRay is not by itself a reason to choose customer-hosted. The reason is custody of the data and the substrate.
Moving between models is a deployment change, not a migration. Your namespaces, collections and retrievers are defined through the API and move with you.