Requirements
Set it up
1
Build the image
Check out The build targets your machine’s architecture. Add
server/ and studio/ from the repository, with your usual GitHub credentials for the private repository. Stage Studio into the build context, then build.--platform linux/arm64 or --platform linux/amd64 to choose one.The checkout took about 3 minutes and 2.5 GB. A full clone with history took 4 minutes and 6.3 GB. A cold build on an 8-CPU arm64 Linux VM with no cached images took between 7 and 13 minutes across two runs. Later builds reuse cached layers.2
Start the container
Set Docker’s memory to 16 GB first. In Docker Desktop, open Settings, then Resources.
The volume
mixpeek-data holds all state. Publish only these three ports. If another service on your machine already uses one of them, change the number on the left of that -p pair, for example -p 13000:3000.With Colima, start the VM with colima start --memory 16. If a container named mixpeek already exists, remove it first with docker rm -f mixpeek. The volume stays.--stop-timeout 60 gives the stack time to shut down. MVS needs about 10.6 seconds to stop cleanly. Docker waits 10 seconds by default, then kills the container. With the flag, docker stop takes about 23 seconds and exits 0.3
Wait until it is healthy
starting while Ray builds its Serve applications. In a clean-host run, /ready answered after 44 seconds and the seed step finished after 48 seconds. A restart with data on the volume takes about a minute. Allow up to 10 minutes on a cold start.If the status becomes degraded, run docker logs mixpeek and look for the component named in /health.4
Read your credentials
The container creates one organization on first start and writes its API key to the volume.The command prints two comment lines that start with
# and five settings: MIXPEEK_API_KEY, MIXPEEK_NAMESPACE_ID, MIXPEEK_ORG_NAME, MIXPEEK_ORG_ID and MIXPEEK_API_URL. The key survives restarts.Export the settings into your shell:5
Call the API
List the buckets in your namespace. The response includes the starter bucket the container seeds.The Python SDK takes the local address too, and the address needs the
/v1 on the end: Mixpeek(api_key=..., base_url="http://localhost:8000/v1"). Without it every call returns 404. The MIXPEEK_API_URL that the credentials command prints has no /v1.6
Add documents and search
The starter bucket The output lists the documents with their scores, best match first. The document about resetting a password comes first, with a score near 0.8. The other three score close to zero.
sample-documents is empty. This script runs inside the container. It uploads four short documents, runs a batch through Ray, waits for it to finish, and searches with the starter retriever search. It takes about 30 seconds.7
Open Studio
Open
http://localhost:3000. Studio needs no sign-in. A banner across the top says authentication is bypassed. Studio calls the API in this container with the seeded key.The seeded namespace default holds a starter bucket, a starter collection and a retriever named search.Check that everything works
Two test suites ship inside the image. Both run against the container itself.
The
e2e run prints (manifest contract validator not found, skipping). That is expected. The matrix prints one row per primitive and operation, 147 in all: 145 PASS and 2 VOID. The two VOID rows call an LLM and need a key. A row is PASS, FAIL, or VOID when the container cannot exercise it. The command exits with status 1 on any FAIL. The report is at /data/logs/lifecycle-matrix/lifecycle-matrix.md inside the container.
Choose the default extractor
The seeded namespace usestext_extractor. It runs the MiniLM model (all-MiniLM-L6-v2, 384 dimensions), and the image carries the weights. This default needs no API key and makes no paid call. It works with the network off.
To use the multimodal universal_extractor instead, pass a Gemini or OpenAI key and name the extractor. The container applies the default when it creates the organization, so start from an empty volume with docker rm -f mixpeek && docker volume rm mixpeek-data.
/health reports "mode": "keyed" when a key is present.
Media extractors
The image serves two inference apps: MiniLM andtaxonomy_join. It carries no GPU models. The image, audio and video extractors resolve to models such as SigLIP, CLAP or ArcFace, and the image does not include them.
The image accepts media files, detects their type, stores them and lists them. Only the embedding step cannot run. The media test driver reports that step as VOID and names the missing model:
universal_extractor embeds media through the Gemini API.
Add an extractor with YAML
Put a*.yaml file in a directory, mount it at /data/plugins, and restart the container. The extractor appears in the API next to the built-in ones. You write no Python and rebuild nothing.
PATCH. It adds the extractor to the ones the namespace already has.
feature_extractor is {"feature_extractor_name": "product_copy_embedder", "version": "v1", "input_mappings": {"text": "content"}}, the same way you would for text_extractor. A batch through it completed in 21 seconds and produced 384-dimension MiniLM vectors.
extends reuses a built-in extractor’s definition and Ray pipeline. The model registry sets the vector dimensions, so the YAML does not state them. A spec that fails to load stops the container.
Operate the container
The volume survives
docker stop, docker start and replacing the container. If you delete the volume, the container creates a new organization and a new API key on the next start.
The image runs no Celery process and no broker. A Mongo-backed work ledger and a Ray dispatcher run the background tasks. celery-worker and celery-beat show as disabled in /health.
Memory
Give Docker 16 GB. The idle container uses about 7.8 GiB, and 7.4 GiB of that is Ray.What the image leaves out
Quickstart
Create a namespace, add data and search.
Concepts
Namespaces, buckets, collections and retrievers.
Studio
Work with the same platform in the UI.
Deployment
Kubernetes and managed Ray topologies.

