Skip to main content

Sandbox Ports and Endpoints

This is a quick reference for the URLs and ports your local Michelangelo sandbox exposes on localhost. After ma sandbox create finishes, use this page to find where to point your browser, your CLI, or your SDK client.

If you haven't set up the sandbox yet, start with Sandbox Setup first.

The most common URLs you'll open after the sandbox is up:

ServiceURLDefault credentials
Michelangelo UIhttp://localhost:8090none
MinIO Consolehttp://localhost:9090minioadmin / minioadmin
Cadence Web (default)http://localhost:8088none
Temporal Web (with --workflow temporal)http://localhost:8080none
Grafanahttp://localhost:3000none (anonymous access)
Prometheushttp://localhost:9092none
MLflow Tracking (with --include-experimental mlflow)http://localhost:5001none
Ray Dashboard (with --create-compute-cluster)http://localhost:8265none

The MySQL root password is root (database: temporal). Connect with mysql -h 127.0.0.1 -P 3306 -u root -proot.

Heads up: these credentials are intentionally trivial because the sandbox is meant for local development on your machine only. Do not reuse them anywhere else.

All exposed ports

Every port below is mapped from the k3d cluster to your host so you can reach it directly from localhost.

Default sandbox (Cadence workflow engine)

These mappings are created automatically by ma sandbox create:

ServiceHost portNodePortIn-cluster serviceContainer portWhat it's for
Michelangelo UI809030011michelangelo-ui8090Web UI — your main entry point
Michelangelo API Server1556630009michelangelo-apiserver15566gRPC API (YARPC) for SDK and CLI clients
Envoy (gRPC-web proxy)808130010michelangelo-envoy8081gRPC-web → gRPC bridge used by the UI
Cadence Web808830004michelangelo-cadence-web8088Inspect, retry, and debug Cadence workflow runs
Cadence Frontend (gRPC)783330002michelangelo-cadence7833Cadence SDK and client connections
Cadence Frontend (TChannel)793330003michelangelo-cadence7933Cadence internal RPC
MySQL330630001mysql3306Metadata storage for the workflow engine
MinIO (S3 API)909130007minio9091S3-compatible object storage endpoint
MinIO (Console)909030008minio9090Web UI for browsing buckets
Grafana300030012grafana3000Dashboards (skipped with --exclude grafana)
Prometheus909230015prometheus9090Metrics (skipped with --exclude prometheus)
MLflow Tracking500130013mlflow5000Experiment tracking (only deployed with --include-experimental mlflow)

Temporal workflow engine

When you pass --workflow temporal, the sandbox swaps the Cadence-specific mappings for Temporal ones at cluster-create time. The Cadence Web port is not exposed; everything else above (UI, API Server, MinIO, MySQL, Grafana, Prometheus, MLflow) stays the same.

ServiceHost portNodePortIn-cluster serviceWhat it's for
Temporal Web808030005michelangelo-temporal-webInspect, retry, and debug Temporal workflow runs

Note: the Temporal frontend gRPC service (michelangelo-temporal-frontend:7233) is reachable inside the cluster but is not auto-exposed on the host. If you need direct host access for SDK testing, port-forward it manually:

kubectl port-forward svc/michelangelo-temporal-frontend 7233:7233

Optional Ray compute cluster

If you ran ma sandbox create --create-compute-cluster, a second k3d cluster is created for Ray jobs with these mappings:

ServiceHost portWhat it's for
Ray Dashboard8265Browse Ray jobs, actors, and resources
Ray Client10001Submit jobs from a Ray client

Without --create-compute-cluster, the main sandbox cluster itself acts as the Ray target — you can still run Ray workloads, just not in an isolated cluster.

Connecting from outside the cluster

A few common patterns once the sandbox is up:

# Open the Michelangelo UI
open http://localhost:8090

# Talk to the API server with grpcurl
grpcurl -plaintext localhost:15566 list

# Connect to MySQL
mysql -h 127.0.0.1 -P 3306 -u root -proot temporal

# Use MinIO with the AWS CLI (S3-compatible)
AWS_ACCESS_KEY_ID=minioadmin AWS_SECRET_ACCESS_KEY=minioadmin \
aws --endpoint-url http://localhost:9091 --region us-east-1 s3 ls

Troubleshooting port conflicts

If ma sandbox create fails because a host port is already bound, find what's holding it and free it up:

# Find the process using a port (e.g., 9090)
lsof -i :9090

# Stop it if it's safe to do so
kill <PID>

Then retry:

# Non-destructive — preserves existing sandbox state
ma sandbox stop && ma sandbox start

# Destructive — wipes the cluster and starts fresh
ma sandbox delete && ma sandbox create

For other sandbox issues (image pulls, crashing pods, Temporal namespace errors), see the Troubleshooting section in Sandbox Setup.

Advanced: in-cluster ports

You usually don't need these — they're for developers debugging Kubernetes networking, writing controllers, or running probes from inside the cluster.

ComponentPortPurpose
michelangelo-controllermgr8091Controller manager metrics
michelangelo-controllermgr8081Controller manager health probe
michelangelo-apiserver15566gRPC API
michelangelo-envoy8081gRPC-web proxy
michelangelo-cadence7833Cadence frontend (gRPC)
michelangelo-cadence7933Cadence frontend (TChannel)
michelangelo-cadence-web8088Cadence Web UI
michelangelo-temporal-frontend7233Temporal frontend (gRPC)
michelangelo-temporal-web8080Temporal Web UI
minio9090 / 9091Console / S3 API
mysql3306MySQL