Discover / LLM Ops & Observability
Laminar
by lmnr-aiTypeScript
Open-source observability and analytics for AI agents and LLM apps.
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 matchedNo 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 confidenceAgent 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
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>