Getting started

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.

☸️ Kubernetes cluster Rancher Desktop · k3d · minikube
Helm 3.x brew install helm
🔧 kubectl brew install kubectl
🖥️ 4 GB RAM available to cluster Pulsar needs ~1.5 GB
ℹ️

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

1
Add the Helm repository
Add the Open-M chart repository and fetch the latest index.
bash
$ helm repo add open-m https://charts.open-m.dev
$ helm repo update
2
Create the system namespace and install
This installs the Open-M operator, the control plane API, Apache Pulsar (single-node dev profile), and the Schema Registry.
bash
$ 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

3
Check that all pods are Running
bash
$ 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.

yaml — hello-pipeline.yaml
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

4
Create the namespace and apply the YAML
bash
$ 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

5
Port-forward the HTTP listener and send a test message
bash
# 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"}
Watch the log output
bash
$ 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: