Connect in two minutes.
Langfuse or OpenTelemetry in, proven PRs out. Six steps, about two minutes for Langfuse users.
( 01 )Create a project
Sign up, create a project for one AI app and describe what it should do. Jev checks every trace against that. You get an ingest token that starts with
sut_. It is shown once, so keep it in your secret manager.( 02 )Connect Langfuse (no code)
In the project, choose Connect → Langfuse and enter the Langfuse project’s public key, secret key and host (
cloud.langfuse.comor your own). Keys are stored encrypted.Suture backfills the last 7 days, then polls every minute. It backs off when Langfuse rate-limits, and never ingests the same trace twice.
( 03 )Or send OpenTelemetry (any language)
Point your OTLP/HTTP exporter at Suture. The endpoint accepts protobuf and JSON, and reads the OpenTelemetry GenAI and OpenInference attribute names, so most LLM instrumentation libraries work as they are.
shell / .env OTEL_EXPORTER_OTLP_TRACES_ENDPOINT=https://<your-suture-host>/api/otlp/v1/traces OTEL_EXPORTER_OTLP_TRACES_HEADERS=Authorization=Bearer%20<ingest-token> OTEL_EXPORTER_OTLP_TRACES_PROTOCOL=http/protobuf OTEL_SERVICE_NAME=content-apipython / tracing.py from opentelemetry import trace from opentelemetry.sdk.trace import TracerProvider from opentelemetry.sdk.trace.export import BatchSpanProcessor from opentelemetry.exporter.otlp.proto.http.trace_exporter import OTLPSpanExporter provider = TracerProvider() provider.add_span_processor(BatchSpanProcessor(OTLPSpanExporter())) # reads OTEL_* env vars trace.set_tracer_provider(provider)typescript / instrumentation.ts import { NodeSDK } from '@opentelemetry/sdk-node'; import { OTLPTraceExporter } from '@opentelemetry/exporter-trace-otlp-proto'; // Reads OTEL_* env vars. Start before the rest of your app loads. new NodeSDK({ traceExporter: new OTLPTraceExporter() }).start();( 04 )Map traces to code
A fix needs to know which file a prompt lives in. Tag the span or the code, let Suture match prompt text against your repo, or map it once by hand in the app.
either one # On the span that calls the model span.set_attribute("suture.prompt_id", "orchestrator.system") // Or next to the prompt in your code // @suture prompt:orchestrator.system( 05 )Install the GitHub App
Install the Suture GitHub App on the repository, pick an autonomy level (the default is
pr), and Suture opens one small, proven PR per Issue. Nothing merges until you approve.( 06 )Optional: Issues in your editor
The MCP server lets Claude Code or Cursor list Issues, read fix plans and pull failing cases into your session.
shell / claude code claude mcp add --transport http suture https://<your-suture-host>/api/mcp \ --header "Authorization: Bearer <personal-token>"