Skip to content
preview · endpoints may change before launch

Connect in two minutes.

Langfuse or OpenTelemetry in, proven PRs out. Six steps, about two minutes for Langfuse users.

  1. ( 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.

  2. ( 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.com or 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.

  3. ( 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-api
    python / 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();
  4. ( 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
  5. ( 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.

  6. ( 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>"