Getting started

Quickstart

Bring up Metroflow locally with Docker Compose, verify the API is healthy, and connect your first dbt + Snowflake sources. Production Kubernetes deployment is covered at the end.

Prerequisites

Metroflow runs entirely in containers. You need a machine with enough headroom for the API, crawler, graph store, and workspace UI.

Tip: Metroflow works with free-tier Snowflake trials and local Postgres; no paid warehouse required to validate the setup.

Install with Docker Compose

Five steps from empty directory to a live workspace. Each step includes the exact commands to run.

  1. Clone the repository

    Pull the latest stable branch from GitHub. All services are defined in the root docker-compose.yml.

    shell
    $git clone https://github.com/metroflow/metroflow.git
    $cd metroflow
  2. Configure environment variables

    Copy the example env file and set secrets. At minimum, generate a METROFLOW_SECRET_KEY and confirm the database URL.

    shell
    $cp .env.example .env
    # Edit .env: required keys:
    METROFLOW_SECRET_KEY=your-random-32-char-secret
    METROFLOW_DATABASE_URL=postgresql://metroflow:metroflow@db:5432/metroflow
    METROFLOW_PUBLIC_URL=http://localhost:4200

    Warning: Never commit .env to version control. Use your secrets manager or CI variables in production deployments.

  3. Start all services

    Docker Compose pulls images and starts the API, crawler, graph database, and workspace UI. First boot may take 2–3 minutes while images download.

    shell
    $docker compose up -d
    ✓ metroflow-api running
    ✓ metroflow-crawler running
    ✓ metroflow-ui running
    ✓ metroflow-db running
  4. Open the workspace

    Navigate to the workspace UI in your browser. Sign in with the default admin credentials from .env, then change the password on first login.

    browser
    http://localhost:4200
  5. Connect your first source

    In the workspace, open Settings → Connectors → Add source. Pick dbt and Snowflake (or Postgres for a zero-credential trial), paste credentials, and trigger an initial sync.

What just started?

Compose launches four core services that work together out of the box:

  • metroflow-api: REST API on port 8080
  • metroflow-crawler: Metadata ingestion workers
  • metroflow-ui: Workspace at :4200
  • metroflow-db: Graph and catalog persistence

Verify installation

Confirm the API is reachable and all dependent services report healthy before connecting sources.

shell
$curl -s http://localhost:8080/api/v1/health | jq
{
"status": "ok",
"version": "1.x.x",
"services": { "api": "up", "crawler": "up", "db": "up" }
}

You can also tail crawler logs to watch the first sync after adding a connector:

shell
$docker compose logs -f metroflow-crawler

Connect your first source

The fastest path to a populated graph is dbt + Snowflake. Metroflow reads your manifest and warehouse metadata, then links models to tables automatically.

1. Add Snowflake

In the workspace connector wizard, select Snowflake and provide read-only credentials. Metroflow ingests information_schema metadata only.

connector config
account: <org>-<account>
warehouse: COMPUTE_WH
role: METROFLOW_READER
database: ANALYTICS

2. Add dbt

Point Metroflow at your dbt project directory or CI artifact. It parses manifest.json and catalog.json to build model-level lineage.

shell
$dbt docs generate
# In workspace: Connectors → dbt → path to target/
# Or set DBT_PROJECT_DIR in .env for automatic discovery

3. Run initial sync

Trigger a manual sync from the connector detail page or via the API. Within a few minutes you should see tables, models, and ref edges in the graph explorer.

shell
$curl -X POST http://localhost:8080/api/v1/connectors/sync \
-H "Authorization: Bearer $METROFLOW_TOKEN" \
-H "Content-Type: application/json" \
-d '{"connector_id": "snowflake-analytics"}'

Tip: Start with a single dbt package and one Snowflake database. Expand connector scope after you confirm lineage looks correct.

Kubernetes (optional)

For production, use the official Helm chart. It mirrors the Compose topology with configurable replicas, ingress, and external Postgres.

shell
$helm repo add metroflow https://charts.metroflow.dev
$helm repo update
$helm install metroflow metroflow/metroflow \
--namespace metroflow --create-namespace \
-f values.production.yaml

See Deployment for ingress, TLS, external secrets, and horizontal scaling guidance.

Next steps

Your control plane is live. Continue with these guides to expand coverage and automate workflows.