LaserData Cloud
Laser SDK

Laser Stack

Run the complete Laser SDK locally with Laser Stack, Apache Iggy VSR, and laser-plane.

Laser Stack runs the complete SDK locally. It starts the LaserData Apache Iggy fork and laser-plane. The startup script waits for both services and prints their connection string.

Use Laser Stack for projections, query, change feed, KV, forks, graph, RBAC, and runs. Standalone VSR-enabled Iggy supports streaming and log-backed agent features. It does not provide managed data APIs.

Requirements

  • Docker Engine 25 or a current Docker Desktop.
  • Docker Compose v2.20 or later.
  • A 64-bit amd64 or arm64 system. Published images support both, including Apple Silicon.

Start the stack

git clone https://github.com/laserdata/laser-stack
cd laser-stack
./scripts/up

The first run creates a mode-600 .env. It pulls the published images when available, starts both services, waits for health, and prints:

export LASER_CONNECTION_STRING='iggy:[email protected]:8090'

Use the printed value. The default credentials are iggy:laser. For a new data volume, ./scripts/up --random-password creates a random password.

Verify Iggy and laser-plane health:

./scripts/smoke

If the registry is unavailable, later runs use cached images. If no published or cached image is available, the script builds from signed binaries. The default listeners bind to 127.0.0.1. Other machines cannot reach them.

What runs

ServiceRoleLocal endpoint
LaserData Apache Iggy forkDurable log, authentication, VSR transport, and managed-command forwardingTCP 127.0.0.1:8090, HTTP 127.0.0.1:3000
laser-plane sidecarProjection, query, state, graph, change-feed, authorization, and run read modelsInternal Unix socket shared with Iggy

Iggy owns the durable log. laser-plane consumes its control and data records. It maintains read models and handles managed operations. Applications use the existing SDK connection for both services.

The stack uses separate Docker volumes for Iggy and plane data. ./scripts/down keeps them. ./scripts/reset deletes them.

VSR only

Rust, Python, and TypeScript always use VSR (Viewstamped Replication Revisited). Classic Iggy framing has no feature flag, connection option, or fallback.

  • Rust and Python are built with Iggy's VSR client enabled.
  • TypeScript always constructs a VSR client and rejects an injected Iggy client configured for another protocol.
  • Standard streaming commands, managed reads, and replicated authorization writes share the same connection. The server classifies the operation path.

VSR handles Iggy transport and replication. AGDX defines the data carried over it. VSR does not change AGDX envelopes or headers.

Connect every client

Export the value printed by ./scripts/up, then connect with the idiomatic environment path in each client:

import { Laser } from "@laserdata/laser-sdk"

await using laser = await Laser.connectEnv()
use laser_sdk::prelude::*;

let laser = Laser::connect_env().await?;
import os
import laser_sdk as ls

laser = await ls.Laser.connect(
    os.environ["LASER_CONNECTION_STRING"],
    stream=os.environ.get("LASER_STREAM"),
)

Rust and TypeScript provide connect_env and connectEnv. Python uses Laser.connect, so pass the environment values directly.

Run the SDK examples

The laser-sdk examples cover the same primitives in all clients. The query example checks both Iggy and laser-plane.

The Rust workspace manifest declares its minimum supported Rust version. Python requires 3.10 or later. TypeScript requires Node.js 22.14 or later.

git clone https://github.com/laserdata/laser-sdk

Run the command for your client from the directory containing that checkout:

cd laser-sdk/examples/typescript
npm run setup
npm run example:query
cd laser-sdk/examples/rust
cargo run --example query
cd laser-sdk/examples/python
python3 -m venv .venv
source .venv/bin/activate
python3 -m pip install laser-sdk
python3 query.py

Run npm run setup once after cloning the TypeScript examples. Each npm run example:<name> command rebuilds before starting its example.

Other focused examples are log, watch, kv, graph, recall, context, and agent. Larger scenarios include native-streaming, event-analytics, order-book, firehose, concierge, memory, interop, orchestra, and governance. TypeScript and Rust use the hyphenated names. Python uses underscores in filenames, such as event_analytics.py. They all use the same environment variables.

Stack commands

CommandAction
./scripts/upStart detached and wait for health
./scripts/up --foregroundRun attached until Ctrl-C
./scripts/up --buildBuild images from signed, pinned binaries
./scripts/up --random-passwordGenerate random credentials for a new data volume
./scripts/smokeCheck Iggy and laser-plane health
./scripts/logs [service]Follow all logs or one service
./scripts/downStop services and keep data
./scripts/resetStop services and delete this stack's data
./scripts/reset --yesReset without a prompt

See the Laser Stack README for version overrides, image verification, local TLS guidance, and troubleshooting.

Choose a target

TargetStreaming and log-backed agentsManaged data surfacesProtocol
Laser StackYesYes, locally through laser-planeVSR
LaserData CloudYesYes, managedVSR
Standalone Apache IggyYesNo, unless a compatible managed backend is attachedVSR required

The API stays the same across targets. Change LASER_CONNECTION_STRING. Check laser.capabilities() before using optional managed features.

On this page