Work in Progress: This page is under development. Use the feedback button on the bottom right to help us improve it.

Quickstart

Get Laminar running locally for development and testing.

Prerequisites

  • Rust toolchain (1.75+)
  • Docker Desktop or Docker Engine 20.10+
  • Docker Compose v2.0+
  • 4GB RAM available

Step 1: Clone the Repository

git clone https://github.com/your-org/laminar.git
cd laminar

Step 2: Start Observability Stack

The observability stack (GrepTimeDB, Vector, Grafana) runs in Docker:

cd setup
docker compose up -d

This starts:

  • GrepTimeDB on port 4000 (HTTP), 4001 (gRPC), 4002 (MySQL), 4003 (PostgreSQL)
  • Grafana on port 3001 (accessible at http://localhost/grafana)
  • Vector for log/metrics collection
  • NGINX reverse proxy on port 80

Step 3: Run Laminar

In a new terminal, from the laminar root directory:

cargo run

This starts the Laminar engine with:

  • HTTP API on port 8000
  • Controller gRPC on port 8001
  • Compiler gRPC on port 8002
  • Admin/Metrics on port 8004

Step 4: Verify Installation

# Check API health
curl http://localhost:8000/health
 
# Check metrics endpoint
curl http://localhost:8004/metrics

Step 5: Access the UI

If running the console separately:

cd laminar-frontend/product
npm install
npm run dev

Open http://localhost:3000 in your browser.


Create Your First Pipeline

Using the API

# Create a source table
curl -X POST http://localhost:8000/api/v1/tables \
  -H "Content-Type: application/json" \
  -d '{
    "name": "test_source",
    "connector": "mock",
    "config": {
      "source_type": "schema_driven",
      "schema_driven": {
        "name": "test",
        "fields": [
          {
            "name": "id",
            "type": "int64",
            "generator": {
              "generator_type": "sequence",
              "start": 1
            }
          },
          {
            "name": "value",
            "type": "string",
            "generator": {
              "generator_type": "uuid"
            }
          }
        ],
        "generation": {
          "mode": "streaming",
          "rate": 10
        }
      }
    },
    "schema": {
      "format": {"json": {}},
      "fields": [
        {"field_name": "id", "field_type": {"type": {"primitive": "Int64"}}, "nullable": false},
        {"field_name": "value", "field_type": {"type": {"primitive": "Utf8"}}, "nullable": false}
      ]
    }
  }'
 
# Create a sink table
curl -X POST http://localhost:8000/api/v1/tables \
  -H "Content-Type: application/json" \
  -d '{
    "name": "test_sink",
    "connector": "stdout",
    "config": {},
    "schema": {
      "format": {"json": {}},
      "fields": [
        {"field_name": "id", "field_type": {"type": {"primitive": "Int64"}}, "nullable": false},
        {"field_name": "value", "field_type": {"type": {"primitive": "Utf8"}}, "nullable": false}
      ]
    }
  }'
 
# Create and start a pipeline
curl -X POST http://localhost:8000/api/v1/pipelines \
  -H "Content-Type: application/json" \
  -d '{
    "name": "test-pipeline",
    "query": "INSERT INTO test_sink SELECT id, value FROM test_source",
    "parallelism": 1
  }'

Configuration

Laminar uses a TOML configuration file. Create laminar.toml:

checkpoint-url = "/tmp/laminar/checkpoints"
default-checkpoint-interval = "1s"
 
[pipeline]
source-batch-size = 512
source-batch-linger = "100ms"
 
[api]
bind-address = "0.0.0.0"
http-port = 8000
 
[controller]
rpc-port = 8001
scheduler = "process"
 
[compiler]
rpc-port = 8002
 
[worker]
task-slots = 16
 
[database.rocksdb]
create-if-missing = true

Run with custom config:

cargo run -- --config ./laminar.toml

Cleanup

# Stop Laminar (Ctrl+C in the cargo run terminal)
 
# Stop observability stack
cd setup
docker compose down
 
# Remove volumes (deletes all data)
docker compose down -v

Next Steps