3.21.0 (2026-10-21)
Features
analytics: campaign conversion events for sign in, sign up and paid (#8445) (c502c44)
auth: setting to restrict self sign-up on self-hosted installs (#8425) (dd31854)
chart: offer Valkey as a Redis option via the redis-valkey overlay (#8881) (7472160)
ci: every code PR states it follows the architecture guide and flags what needs a human look (#8668) (d83a813)
ci: nightly health survives a red typecheck, tracks bundle size, keeps a dashboard issue (#8656) (4741037)
ci: publish langwatch-app frontend assets to the CDN bucket with the ECR image (#8678) (fdb0b7c)
clickhouse: id indexes, so a lookup by id reads only the partitions its rows live in (#8561) (dcb902b)
clickhouse: separate insert and read statement concurrency budgets (#8488) (d96113b)
dashboard: move dashboards v2 onto its own tables (#8707) (7f1f527)
dashboards,insight: dashboards and insights v1 (#8545) (7b5e13d)
governance: aggregate members read over their full history, except by department (#8552) (7125be3)
governance: aggregate project offers Sessions, read through the proof (#8710) (1b57fac)
governance: an aggregate project reads its member projects through shared grants (#8487) (e683dd9)
governance: event-only aggregate reconcile; coding-agent-cost skill narrows by TenantId (#8652) (ad90571)
group-queue: pipeline and job labels on blocked and oldest-age gauges, a non-retryable reason, tenant park logs (#8813) (8735d0a)
instant-eval: release self-hosted installs by their licence alone (#8684) (2f68f76)
instant-evals: opt-in switch for self-serve organizations, clearer refusal popovers (#8348) (0a2baa6)
instant-evals: release self-hosted installs by license, and say why when not (#8416) (fa9139d)
members: developer seat, a member who owns a personal project and nothing shared (#8373) (30ff7ea)
members: join requests made from the terminal land as a Developer and the welcome screen honours pending invitations (#8462) (2687513)
navigation: rename the Admin console to Operations and point Settings to it (#8701) (1bb4f7c)
ops: licence list filters say what they hide (#8788) (044ff58)
ops: self-hosted installs summary, sort and filters; licence list filters (#8776) (f2d13c7)
ops: upgrade alert emails on the shared mail template, with a link per failed step (#8730) (31e5fa8)
otel: decode OTLP bodies by magic bytes (zstd, gzip under wrong Content-Encoding) (#8501) (9ad8f1e)
scenarios: setup and teardown hooks for connected agents (#8765) (b0949cd)
sdks: send traces as gzipped OTLP/protobuf by default in every SDK (#8592) (206c830)
server: npx downloads a prebuilt app; evaluations retry while the evaluator is down (#8845) (6e44487)
sign-up Slack notices as compact cards with links into ops, plus a SCIM push summary (#8700) (498b979)
sims: mcpsim, a simulator of MCP clients driving the hosted MCP endpoint (#8720) (858993d)
tooling: code-search skill (rg, sgrep, gopls) and a .ignore for generated files (#8687) (0ed5e71)
trace,eventing: origin checks can queue only ids (reader release) (#8871) (dc862c8)
upgrade: diagnostics for a failed upgrade step, sent over Connect (#8853) (ba39198)
Bug Fixes
agent testing drawer close and width, dataset upload opens, traces search stays in its project (#8755) (945bf9c)
agent: Edit config shows a stored agent's inputs, outputs and mappings again (#8697) (36b234d)
agent: Edit config shows a stored agent's inputs, outputs and mappings again, and a save keeps what the editor does not show (36b234d)
agent: the code and HTTP agent editors match the previous release again (#8703) (d528e8a)
aigateway: encrypted reasoning returns to OpenAI under the item id it was issued with (#8743) (c74da99)
aigateway: let private provider endpoints dispatch and trust a private CA (#8787) (566634d)
aigateway: merge parallel tool results on the Bedrock Converse lane and keep Bedrock refusal statuses (#8422) (0182e6b)
alerts: read a grouped graph's series ungrouped instead of adding groups together (#8436) (9f4024c)
analytics: keep dashboard panels under the ClickHouse memory limit and show a compact panel error (#8525) (d20264a)
analytics: keep lwql engine tables on a failed converge and reconverge them on a 5-minute check (#8727) (4a1a123)
analytics: read metadata key and value filters from every storage format (#8432) (10878ad)
annotations: serialize annotation commands per trace and 404 on unknown delete (#8400) (7606bf6)
api: admit the shared storage bucket in the page's connect-src (#8746) (67ef03f)
api: put the storage bucket in the page policy's connect-src (#8748) (1f4cd9a)
auth: answer a repeated refresh within 60s with the pair it minted (#8719) (cc70d34)
auth: leave brokered connections to the legacy guard instead of bouncing (#8471) (418a183)
auth: sign-in from pages whose address better-auth refuses (#8503) (#8504) (3d8d9ce)
auth: sign-in without Auth0 on cloud, and restrict platform-operator grants (#8715) (fbd3c4a)
automation: add-to-dataset automations map stored spans whose chat parts the strict span shape rejects (#8693) (7fe05da)
automation: add-to-dataset drops columns the dataset no longer has; a dataset refusal is not retried (#8814) (a18aa42)
automation: drain every overdue settlement match on one wake, and refuse redelivered process events before reading state (#8835) (a8cc843)
automation: read Trigger rows with JSON-string filters/actionParams (#8689) (5a454c9)
automation: settlement refusals the customer must fix warn once instead of paging (#8889) (5321ee1)
automations: evaluation-based automations never fired because the evaluation read returned no rows (#8465) (ab34223)
automation: wrap a long key inside its condition chip (#8909) (42ca2f1)
billing: currency-aware custom retention price on the Growth plan (#8502) (303a35e)
billing: over-seat upgrade prompt, cloud Free creation caps, Free card copy (#8505) (4ea3334)
chart: cap Redis memory at half its limit, production Redis at 3Gi (#8863) (dd2a86e)
ci: a pull request's changed paths are its own commits (#8899) (952568d)
ci: bring main's lint and format checks back to green (#8708) (6162fad)
ci: fewer wasted runner minutes on release PRs, branch smoke tests and chart kind tests (#8680) (0db4f53)
ci: hash the Dockerfile into scenario-process's test cache key (#8698) (3c711ab)
ci: leave the release-please Chart.yaml files to release-please (#8936) (15f97f2)
ci: split package suites over the shards by measured time (#8661) (fb9e0dc)
clickhouse-serverless: bound memory on pods of 4 GiB or less (#8856) (495155c)
dataset: copied entries keep their source order on every collation (#8869) (101f596)
dataset: no error notice over a loaded datasets list; browser reads get a 45 s time limit (#8711) (6ff2741)
dataset: serve the previous release's single-file datasets in place (#8663) (560cad1)
deps: bump OpenTelemetry Go modules to clear govulncheck (#8417) (e477614)
design-system: one emoji picker that dialogs never clip; agent card menu above its neighbours (#8732) (c8d2a9c)
dev: make service loads an env file named without a slash under dash (#8522) (42a381a)
entitlement: stop orphan projects killing the usage-warning sweep (#8886) (778551e)
evaluator: run code evaluators on the project's engine (#8716) (c835601)
eventing,authz: a fold for a deleted project completes instead of retrying (#8733) (fb07bb5)
eventing: drain queue consumers before closing the producer (#8888) (f05e197)
eventing: re-send redelivered events to keyed folds that opt in (#8887) (c61b059)
eventing: record stored events and store duration for every pipeline (#8819) (45aaca9)
eventing: ship the process-manager sweep age indexes as a migration (#8712) (018593b)
eventing: stop the post-#7536 retry storms, keep parked work, and fix the incident's ops readouts (#8801) (827cc17)
eventing: workers claim disjoint batches of due process wakes (#8839) (5bc0448)
experiment: price cached prompt tokens at the cache rates (#8831) (052474d)
experiments: replicated experiment saves to itself, not the original (#8514) (26e6093)
featureparity: move provider-list.feature to the Go legacyPartial list, matching the Node tool (#8931) (0e5f50d)
follow-ups that missed the #7536 merge (eventing leases, group-queue dead workers, upgrade pacing, upgradelab) (#8580) (7aca052)
go: bump the toolchain to go1.27.3 for GO-2026-6809 (#8905) (5d58b64)
group-queue: queue scripts declare Redis 7 flags so none half-applies at the memory cap (#8873) (754d515)
group-queue: stop the listed consumer re-reading parked and blocked groups every 50ms (#8750) (919b8eb)
hosted-mcp: project viewers can connect an MCP client (#8731) (8521239)
hosted-mcp: retire the SSE transport and keep sessions across deploys (#8718) (b4cf76b)
identity: hold unproven and pinned users on the person, not the proof (#8907) (936a90e)
image-proxy: cap the size of relayed images (#8655) (94dbf2a)
image: build the scenario child into the image, and fail loudly without it (#8688) (c8454c5)
image: install the scenario child's build dependencies before building it (#8702) (5520bdf)
image: the new image keeps the previous release's contract, and ships at a third of the size (#8662) (63d2723)
ingest: accept OTLP/JSON spans whose links/events omit default-valued fields (#8478) (2b7c11b)
instant-eval: release regular customers by their own opt-in only on cloud (#8657) (bcd9d7c)
langy,onboarding: production findings on Langy, guided onboarding, gateway drawers and api restarts (#8793) (15ecff3)
langy: centre the mark in the closed launcher before the panel has loaded (#8717) (f59a74a)
langy: fail a spent provider balance on the first call (#8892) (2c516ce)
langy: route Bedrock OpenAI models through Converse, name provider refusals, apply provider changes to cached keys (#8388) (d75ae80)
langy: save a picked default model, name the rejected key, and show the queued question in provider setup (#8486) (681628e)
langy: say how old the newest data is when a time-bounded query returns nothing (#8741) (bc05fd1)
langy: stop guided onboarding from promising work after it stalls (#8714) (addfd4f)
main's CI back to green, with the last strict-layout follow-ups (#8598) (6791316)
model-provider: hold an evaluator's max tokens to the model's limit on Vertex AI (#8824) (e34afda)
model-provider: keep topic clustering off the Codex coding default (#8885) (0398c63)
model-provider: send the stored service account on Vertex AI calls again (#8784) (1e05199)
model-providers: save a first provider with its key and serve openai base urls on the responses lane (#8473) (ddb939c)
model-provider: stretch the providers table to the page width (#8916) (0fcf003)
monitors: refuse parameters that the linked evaluator's settings override (#8435) (b9bc5d1)
nlpgo: harden code-block isolation and internal endpoint auth (#8424) (ff9f1ed)
nurturing: key owner facts uniquely and batch nurturing's busy lanes (#8890) (9c4908a)
nx: a module change no longer marks most of the workspace affected (#8660) (95e0ad7)
observability: log a bounded cause summary on request errors so Loki stops dropping them (#8485) (72e699b)
observability: record every platform metric through the OTel facade so the OTLP push carries it (#8759) (9b089a7)
ops: redrive and discard more than 2,000 dead-letter groups at once (#8751) (41910b8)
ops: skip projects whose team is gone instead of crashing the migration pass (#8696) (a8a25f8)
organization: align governance picker with the create project form (#8913) (4dae0b8)
otel: log unparseable OTLP bodies as client warnings, not PostHog exceptions (#8489) (f73b082)
production error findings since the strict-layout deploy (#8817) (42f3364)
project: switching project on a consent page keeps its query (#8728) (5533f75)
prompt: normalise legacy prompting_technique values when reading stored versions (#8694) (ee389ac)
quiet API-key refusal floods and accept stored text time scales (#8816) (25c45be)
scenario: bound the scenario-run state read by start time (#8713) (6c43f2a)
scenarios: refuse fields PUT /api/scenarios/{id} does not have instead of dropping them (#8438) (891c048)
scenarios: run a project's turns on its own engine, and read that engine's status (#8429) (66c9815)
scenarios: send a relayed turn to the address the app hands out, not the public one (#8431) (4c193ed)
security: pin Node to 24.22.1 for the October 2026 security releases (#8933) (84b8925)
stored-object: map every purpose the previous release wrote to a delivery audience (#8695) (aca30a2)
suites: refuse fields POST /api/suites does not have instead of dropping them (#8437) (3afaf50)
the copy button clears its timer on unmount, and a docs tag stops breaking the docs build (#8669) (7d2912b)
the run dialog no longer crashes when an evaluator is added under On this run (#8673) (c54cf06)
trace input without a root span, and event detail dataset mappings (#8704) (e9d0f65)
trace: give both halves of the ADR-022 spool their object storage (#8690) (ad54b3c)
trace: read Claude SDK and API OpenTelemetry traces correctly (usage once, large attributes, tool output, cache pricing) (#8756) (d86cea4)
trace: render serialised LangChain messages as chat messages (#8747) (b5f64d7)
traces: hidden input stops blanking other attributes (#8865) (1bb7e87)
traces: show costs below a tenth of a cent instead of $0.0000 (#8434) (2d2bf4d)
traces: tie an evaluator's verdict, score and label to that evaluator in trace filters (#8430) (bfc3931)
trace: traces.getById answers stored traces the strict trace shape refuses (#8692) (50a119d)
triggers: refuse a different customGraphId on PATCH instead of ignoring it (#8433) (0ad8ad2)
ui: restore the pre-refactor look across the shell, trace explorer, agent testing and settings (#8588) (ed79ac9)
upgrade rehearsal findings (sign-in load, email lookups, queue cost, config compatibility) (#8637) (0519a1c)
upgrade: finish the five failing background steps; plain-language alert for self-hosted (#8836) (828768c)
upgrade: the upgrade reaches done, and rehearsal fixes (#8676) (742886a)
workflow run answers keep the engine's trace, cost, timing and error; profiles use the reported service name (#8677) (6c601fb)
Miscellaneous
remove the apidiff, visualdiff and related diff tools (#8591) (bf7d2ba)
review: make CodeRabbit review once, quietly, and leave lint to CI (#8897) (eb8c6bf)
sync model registry (704ff1e)
Documentation
add Claude Platform OpenTelemetry integration page (#8753) (58d66ca)
fix crewai and smolagents integration samples (#8794) (a100772)
members: document terminal sign-ups landing on the Developer seat (#8482) (c81ac27)
readme: cover headline says who LangWatch is for (#8452) (a848689)
self-hosting: correct security, env var and Helm values docs against the code (#8426) (92d3399)
self-hosting: throughput by size profile, Redis or Valkey (#8828) (bebeddb)
Code Refactoring
architecture: introduce domain driven separation across the entire monorepo (#7536) (47d3882)
eventing: layer framework packages like a process half, with lint and safety nets (ADR-181, wave 1) (#8822) (31a90f3)
sims: keep mcpsim's readSSE under the complexity limit (#8723) (5f46713)
stored-object: mint ids with the storedobject KSUID resource (#8745) (fc98456)