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 laminarStep 2: Start Observability Stack
The observability stack (GrepTimeDB, Vector, Grafana) runs in Docker:
cd setup
docker compose up -dThis 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 runThis 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/metricsStep 5: Access the UI
If running the console separately:
cd laminar-frontend/product
npm install
npm run devOpen 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 = trueRun with custom config:
cargo run -- --config ./laminar.tomlCleanup
# 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 -vNext Steps
- Docker Compose - Full observability stack configuration
- KIND - Test Kubernetes deployments locally
- Helm Installation - Production Kubernetes setup