Your first Open-M pipeline
This guide takes you from zero to a running integration pipeline. You will install Open-M on a local Kubernetes cluster, write a minimal pipeline YAML, deploy it, and watch a message flow end-to-end. Estimated time: 10 minutes.
Prerequisites
You need the following tools installed and a running local cluster before starting.
For the recommended local development setup with Rancher Desktop and k3d, see the full deployment guide. This quickstart uses the default cluster context.
Step 1 — Install Open-M
$ helm repo add open-m https://charts.open-m.dev $ helm repo update
$ kubectl create namespace open-m-system $ helm install open-m open-m/open-m \ --namespace open-m-system \ --set pulsar.profile=dev \ --set controlPlane.replicaCount=1 \ --wait --timeout 5m
Step 2 — Verify the install
$ kubectl get pods -n open-m-system NAME READY STATUS AGE open-m-operator-7d4f8c9b6-x2pqr 1/1 Running 2m open-m-control-plane-5f6d7b8c9-k9mnp 1/1 Running 2m open-m-schema-registry-6b7c8d9e-j4lmn 1/1 Running 2m pulsar-broker-0 1/1 Running 90s pulsar-bookie-0 1/1 Running 90s
All pods Running? Open-M is ready. If Pulsar is still starting, wait a minute and re-check — it initialises ZooKeeper and BookKeeper before the broker starts.
Step 3 — Write your first pipeline
Create a file called hello-pipeline.yaml. This minimal pipeline reads a message from an HTTP endpoint and logs it. It uses two components and one connection.
apiVersion: open-m/v1 kind: Pipeline metadata: name: hello-pipeline namespace: demo version: 1.0.0 description: Minimal HTTP → Log pipeline spec: defaults: delivery_guarantee: at_least_once subscription_type: Shared schemas: - ref: demo.schemas.generic-json:1.0.0 type: JSCH components: - id: http-in ref: open-m.connectors.http-listener:1.0.0 config: port: 8090 path: /ingest method: POST ports: output: schema_ref: demo.schemas.generic-json:1.0.0 format: JSON - id: log-out ref: open-m.connectors.logger:1.0.0 config: level: INFO include_envelope: true ports: input: schema_ref: demo.schemas.generic-json:1.0.0 format: JSON connections: - id: http-to-log from: component: http-in port: output to: component: log-out port: input route: topic: demo.hello-pipeline.http-in.out subscription: demo.hello-pipeline.log-out.sub
Step 4 — Deploy the pipeline
$ kubectl create namespace demo $ kubectl apply -f hello-pipeline.yaml pipeline.open-m.dev/hello-pipeline created $ kubectl get pods -n open-m-pipelines NAME READY STATUS AGE hello-pipeline-http-in-0 1/1 Running 12s hello-pipeline-log-out-0 1/1 Running 12s
Step 5 — Send a message and watch it flow
# Forward the HTTP listener port $ kubectl port-forward svc/hello-pipeline-http-in 8090:8090 \ -n open-m-pipelines & # Send a test message $ curl -X POST http://localhost:8090/ingest \ -H "Content-Type: application/json" \ -d '{"hello": "open-m", "timestamp": "2025-04-11T10:00:00Z"}' {"status":"accepted","correlation_id":"a3f8b2c1-9d4e-4f7a-b6c2-1d8e3f4a5b6c"}
$ kubectl logs -f hello-pipeline-log-out-0 -n open-m-pipelines [INFO] [hello-pipeline] Message received correlation_id: a3f8b2c1-9d4e-4f7a-b6c2-1d8e3f4a5b6c schema_ref: demo.schemas.generic-json:1.0.0 delivery: at_least_once step: 1 of 1 payload: {"hello":"open-m","timestamp":"2025-04-11T10:00:00Z"}
Your first Open-M pipeline is running. The message flowed from the HTTP listener through a Pulsar topic — wrapped in an MPPM envelope with a correlation ID — and was received and logged by the logger component.
Next steps
Now that you have the basics running, explore these areas: