Discover / LLM Ops & Observability

Laminar

by lmnr-aiTypeScript

Open-source observability and analytics for AI agents and LLM apps.

Toolexperimental

Maturity: experimental because latest release v0.2.1 is pre 1.0. Derived from release and commit history, not a rating.

Stars
3.1k
Forks
220
Downloads / mo
35.1M
Last commit
2026-08-02
License
Apache-2.0
Open issues
107

Market and trust evidence

Edition not yet matched

No exact skills.sh identity match is available for this repository. Repository adoption and freshness remain visible above; install momentum is not inferred.

Trust analysis is a screening signal, not a security warranty. Read the ranking and trust methodology.

In practice

Written by AI from this repository’s README · high confidence

Agent runs fail in ways generic APM cannot describe, and there is no way to query what the agent actually did.

Use it when

Use it when you run agents and want traces, plain English behaviour signals and evals in one self hostable stack.

Not the right pick when

Self hosted deployments collect anonymized usage telemetry unless you opt out, and the README recommends the managed platform for production.

Capabilities

  • OpenTelemetry native tracing SDK that instruments many frameworks in one line
  • Signals describing agent behaviour in plain English with Slack alerts
  • evals SDK and CLI for local or CI/CD runs with a comparison UI
  • MCP and CLI access to query traces, spans and metrics with SQL
  • dashboard builder supporting custom SQL queries
  • 20x trace compression and realtime trace viewing

Requirements

  • Docker compose for self hosting
  • a project API key generated from a created project
  • an LLM provider key in .env for the optional AI features

Cost: Open source with a paid cloud option

Install

Derived from the published package name in the repository, not from a model.

Video walkthroughs

Third-party YouTube uploads matched to this tool by title, channel and repository name on 2026-08-03. Not made, reviewed or endorsed by SkillPilot. View counts and publish months are as of the match date and the month is approximate. Nothing loads from YouTube until you press play.

What the repository ships

Ships CLAUDE.mdDocker imageCI configured

Detected from the actual files in the repository root.

Latest release v0.2.1

Published 2026-07-09

What's Changed

  • refactor(LAM-1789): sync signals OTEL tracing refactor to OSS by @laminar-coding-agent[bot] in https://github.com/lmnr-ai/lmnr/pull/1924
  • remove slow tools check in default signal prompt by @Rainhunter13 in https://github.com/lmnr-ai/lmnr/pull/1932
  • feat(clusters): Clusters UI Refresh by @kolbeyang in https://github.com/lmnr-ai/lmnr/pull/1903
  • feat(landing): add debugger by @kolbeyang in https://github.com/lmnr-ai/lmnr/pull/1931
  • LAM-1804: Copy signal settings sidebar + custom alert filters to OSS by @laminar-coding-agent[bot] in https://github.com/lmnr-ai/lmnr/pull/1934
  • fix: alert sheet skeleton no longer traps on failed signals fetch by @laminar-coding-agent[bot] in https://github.com/lmnr-ai/lmnr/pull/1935
  • chore: drop unused labeling_queue_items Postgres table (LAM-1808) by @laminar-coding-agent[bot] in https://github.com/lmnr-ai/lmnr/pull/1937
  • add a switch so sql API requests >N bytes do direct disk read by @dinmukhamedm in https://github.com/lmnr-ai/lmnr/pull/1940
  • feat(onboarding): add CLI setup connect step as final wizard page (LAM-1802) by @laminar-coding-agent[bot] in https://github.com/lmnr-ai/lmnr/pull/1933
  • feat(api-keys): API key expiration + creator user_id (LAM-1666) by @laminar-coding-agent[bot] in https://github.com/lmnr-ai/lmnr/pull/1941
  • fix(auth): sign-in provider icon colors (LAM-1817) by @laminar-coding-agent[bot] in https://github.com/lmnr-ai/lmnr/pull/1950
  • fix(signals): allow free-tier users to access signal settings LAM-1818 by @kolbeyang in https://github.com/lmnr-ai/lmnr/pull/1951
  • feat(frontend): serve under a configurable base path (LAM-1749) by @laminar-coding-agent[bot] in https://github.com/lmnr-ai/lmnr/pull/1895
  • refactor: update README by @kolbeyang in https://github.com/lmnr-ai/lmnr/pull/1908
  • fix: scope main-agent output span lookup by trace_id (LAM-1821) by @laminar-coding-agent[bot] in https://github.com/lmnr-ai/lmnr/pull/1952
  • LAM-1807: denormalize cache-read & reasoning tokens onto trace row by @laminar-coding-agent[bot] in https://github.com/lmnr-ai/lmnr/pull/1942
  • LAM-1830: port public agent/MCP changes from lmnr-private by @laminar-coding-agent[bot] in https://github.com/lmnr-ai/lmnr/pull/1959
  • create rw keys for CLI setup by @dinmukhamedm in https://github.com/lmnr-ai/lmnr/pull/1960
  • LAM-1811: drop unused events/tags ClickHouse tables and clean up usages by @laminar-coding-agent[bot] in https://github.com/lmnr-ai/lmnr/pull/1939
  • per million tokens pricing for signals by @dinmukhamedm in https://github.com/lmnr-ai/lmnr/pull/1962
  • remove signals feature on backend test action by @dinmukhamedm in https://github.com/lmnr-ai/lmnr/pull/1967
  • fix: merge metadata on trace pre-agg as well, pg already does similar by @dinmukhamedm in https://github.com/lmnr-ai/lmnr/pull/1969
  • LAM-1839: show project name in signal event email notifications by @laminar-coding-agent[bot] in https://github.com/lmnr-ai/lmnr/pull/1964
  • feat(slack): port public Slack channel-agent scaffolding to OSS (LAM-1847) by @laminar-coding-agent[bot] in https://github.com/lmnr-ai/lmnr/pull/1970
  • feat: mirror private impl by @olzhik11 in https://github.com/lmnr-ai/lmnr/pull/1971
  • Fix/integrations by @olzhik11 in https://github.com/lmnr-ai/lmnr/pull/1972
  • LAM-1806: render all signal findings in trace-view panel by @laminar-coding-agent[bot] in https://github.com/lmnr-ai/lmnr/pull/1936
  • cleanup signal steps notion (fully removed from) DB now by @dinmukhamedm in https://github.com/lmnr-ai/lmnr/pull/1973
  • fix: opengraph images by @kolbeyang in https://github.com/lmnr-ai/lmnr/pull/1966
  • fix(billing): pricing accuracy and usage-page UI fixes (LAM-1857) by @olzhik11 in https://github.com/lmnr-ai/lmnr/pull/1978
  • fix(search): render filter tags for unregistered columns (LAM-1853) by @laminar-coding-agent[bot] in https://github.com/lmnr-ai/lmnr/pull/1976
  • LAM-1854: query engine accepts INTERVAL with unit inside string literal by @laminar-coding-agent[b

Tags

README

<a href="https://www.ycombinator.com/companies/laminar-ai">Static Badge</a>

<a href="https://x.com/lmnrai">X (formerly Twitter) Follow</a>

<a href="https://www.linkedin.com/company/lmnr-ai">LinkedIn</a>

<a href="https://discord.gg/nNFUUDAKub"> Static Badge </a>

Laminar banner

Laminar

Laminar is an open-source observability platform purpose-built for AI agents.

  • [x] Tracing. Docs
  • [x] OpenTelemetry-native powerful tracing SDK - 1 line of code to automatically trace Vercel AI SDK, Browser Use, Stagehand, LangChain, OpenAI, Anthropic, Gemini, and more.
  • [x] Signals. Docs
  • [x] Describe any behavior of your agent that you want to track in plain English (e.g. "agent is stuck in a loop")
  • [x] Laminar reads every agent run and pings you in Slack when it happens.
  • [x] Evals. Docs
  • [x] Unopinionated, extensible SDK and CLI for running evals locally or in CI/CD pipeline.
  • [x] UI for visualizing evals and comparing results.
  • [x] MCP / CLI access for your coding agent
  • [x] Query traces, spans, metrics, and events with SQL
  • [x] Let your coding agent investigate and debug issues based on your traces
  • [x] Dashboards. Docs
  • [x] Powerful dashboard builder for traces, metrics, and events with support of custom SQL queries.
  • [x] Data annotation & Datasets. Docs
  • [x] Custom data rendering UI for fast data annotation and dataset creation for evals.
  • [x] Extremely high performance.
  • [x] Written in Rust 🦀
  • [x] 20x trace compression for efficient ingestion and storage. Read more about it here.
  • [x] Custom realtime engine for viewing traces as they happen.
  • [x] Ultra-fast full-text search over span data.
  • [x] gRPC exporter for tracing data.

Traces

Documentation

Check out the full documentation here laminar.sh/docs.

Getting started

The fastest and easiest way to get started is with our managed platform -> laminar.sh

Self-hosting with Docker compose

Laminar is very easy to self-host locally. For a quick start, clone the repo and start the services with docker compose:


git clone https://github.com/lmnr-ai/lmnr
cd lmnr
docker compose up -d

This will spin up a lightweight but full-featured version of the stack. This is good for a quickstart

or for lightweight usage. You can access the UI at http://localhost:5667 in your browser.

You will also need to properly configure the SDK, with baseUrl and correct ports. See guide on self-hosting.

For production environment, we recommend using our managed platform or docker compose -f docker-compose-full.yml up -d.

Configuring LLM provider (optional)

Frontend AI features (chat-with-trace, SQL-with-AI) and server-side AI workers require an LLM provider. Configure one in your .env file at the repo root.

Pick one of the following provider setups. LLM_MODEL_SMALL|MEDIUM|LARGE are optional — per-provider defaults apply when unset. LLM_DEFAULT_HEADERS_JSON is optional for any provider or gateway that requires static headers.


# Optional for any provider/gateway that requires static headers
# LLM_DEFAULT_HEADERS_JSON='{"X-Gateway-Tenant":"tenant"}'

# Option A: Gemini
LLM_PROVIDER=gemini
LLM_API_KEY=your_gemini_key

# Option B: OpenAI (or any OpenAI-compatible gateway such as LiteLLM, OpenRouter, vLLM)
LLM_PROVIDER=openai
# LLM_BASE_URL=http://localhost:4000   # optional, for OpenAI-compatible gateways
LLM_API_KEY=your_openai_key

# Option C: AWS Bedrock (Anthropic Claude). Uses AWS credentials instead of LLM_API_KEY.
LLM_PROVIDER=bedrock
AWS_ACCESS_KEY_ID=...
AWS_SECRET_ACCESS_KEY=...
AWS_REGION=us-east-1

Custom Postgres schema (optional)

By default Laminar uses the public schema. To target a different schema (e.g.

when deploying alongside other services in a shared Postgres instance), set the

same value for both the frontend and the app-server:


POSTGRES_SCHEMA=laminar
# Set to false if the schema is pre-provisioned or the DB role lacks CREATE.
# POSTGRES_CREATE_SCHEMA=true

The schema is applied as the connection search_path, so all tables, foreign

keys, and migrations target it. When a non-public schema is set, the frontend

also tracks migrations inside that schema (<schema>.__drizzle_migrations)

rather than the shared drizzle schema. Note that running Laminar alongside

another Drizzle-managed service in the same database may still require manual

intervention, since Drizzle's migration journal is versioned per-schema.

Anonymous usage telemetry

Self-hosted deployments collect anonymized usage telemetry. To opt out, set LAMINAR_TELEMETRY_DISABLED=true in your .env.

Contributing

For running and building Laminar locally, or to learn more about docker compose files,

follow the guide in Contributing.

TS quickstart

First, create a project and generate a project API key. Then,


npm add @lmnr-ai/lmnr

It will install Laminar TS SDK and all instrumentation packages (OpenAI, Anthropic, LangChain ...)

To start tracing LLM calls just add


import { Laminar } from '@lmnr-ai/lmnr';
Laminar.initialize({ projectApiKey: process.env.LMNR_PROJECT_API_KEY });

To trace inputs / outputs of functions use observe wrapper.


import { OpenAI } from 'openai';
import { observe } from '@lmnr-ai/lmnr';

const client = new OpenAI({ apiKey: process.env.OPENAI_API_KEY });

const poemWriter = observe({name: 'poemWriter'}, async (topic) => {
  const response = await client.chat.completions.create({
    model: "gpt-4o-mini",
    messages: [{ role: "user", content: `write a poem about ${topic}` }],
  });
  return response.choices[0].message.content;
});

await poemWriter();

Python quickstart

First, create a project and generate a project API key. Then,


pip install --upgrade 'lmnr[all]'

It will install Laminar Python SDK and all instrumentation packages. See list of all instruments here

To start tracing LLM calls just add


from lmnr import Laminar
Laminar.initialize(project_api_key="<LMNR_PROJECT_API_KEY>")

To trace inputs / outputs of functions use @observe() decorator.


import os
from openai import OpenAI

from lmnr import observe, Laminar
Laminar.initialize(project_api_key="<LMNR_PROJECT_API_KEY>")

client = OpenAI(api_key=os.environ["OPENAI_API_KEY"])

@observe()  # annotate all functions you want to trace
def poem_writer(topic):
    response = client.chat.completions.create(
        model="gpt-4o",
        messages=[
            {"role": "user", "content": f"write a poem about {topic}"},
        ],
    )
    poem = response.choices[0].message.content
    return poem

if __name__ == "__main__":
    print(poem_writer(topic="laminar flow"))

Client libraries

To learn more about instrumenting your code, check out our client libraries:

<a href="https://www.npmjs.com/package/@lmnr-ai/lmnr"> NPM Version </a>

<a href="https://pypi.org/project/lmnr/"> PyPI - Version </a>

Related tools