Get started

Start with your coding agent.

One paste. Your agent first installs the LoopOps plugin for its harness — or the shared skill plus MCP — then provisions scoped keys, wires telemetry, proves the first span, and runs the first diagnosis. External writes still stop at your approval.

Fetch https://loopops.dev/agent-setup/prompt.md

Works in Claude Code, Codex, Cursor, Copilot, Windsurf, and OpenCode. Plugin/skill installation is required; the only human steps are approval, one-time email sign-in, and a client restart when needed.

OTLP in MCP out Approval gate intact No email wall
What your agent does
01 · Install

Detects the current coding harness and installs its native LoopOps marketplace plugin, or the shared loop skill plus hosted MCP when no plugin exists. Verifies both before continuing.

02 · Provision

One idempotent call mints three scoped keys — producer, agent, feedback — stored in your env, never committed. Re-running never duplicates the project.

03 · Wire

Vercel AI SDK in one line, any Node process via @getloopops/otel, Cloudflare Workers through native trace export plus approved log export, anything else via raw OTLP. No new SDK if you already emit OpenTelemetry.

04 · Prove

Sends one smoke-test span and reads it back, so the pipe is proven before any real traffic depends on it.

05 · Diagnose

Runs the first diagnosis: clustered failures with cited evidence — the improvement loop's input.

06 · Hand off

Prints your console link, project id, and recovery code — everything you need to keep what it built.

No coding agent? Wire it by hand — keys, your stack, first signal in under a minute
By hand · keys → wire → prove First accepted signal < 1 min
1 · Keys — one curl, no email

Idempotent by name: re-running with one of the returned keys resumes the same project. Save the producer_key, agent_key, and recovery_code — keys are shown once.

curl -sS -X POST https://loopops.dev/v1/provision \
  -H 'content-type: application/json' \
  -d '{"project_name":"my-app"}'
2 · Wire your stack

Vercel AI SDK

Requires ai@7+ · one registration at startup, every generate/tool call flows

npm i @getloopops/sdk
import { registerTelemetry } from "ai";
import { loopOps } from "@getloopops/sdk/ai";
registerTelemetry(loopOps({ agent: "my-app" })); // reads LOOPOPS_URL + LOOPOPS_INGEST_KEY

AI SDK 6 keeps the per-call flag via @getloopops/sdk/otel (Node-only). On Workers/Edge there is no process.env — pass loopOps({ agent, url, ingestKey }) explicitly. Full page: AI SDK docs.

Node / OpenTelemetry

Any Node process · exporter + automatic pickup of @opentelemetry/auto-instrumentations-node — outbound db/http spans become map relationships

npm i @getloopops/otel
// otel.js — run with: node --import ./otel.js app.js
import { initLoopOps } from "@getloopops/otel";
initLoopOps(); // reads LOOPOPS_URL + LOOPOPS_INGEST_KEY

Already running OpenTelemetry? Skip the package — point your OTLP/HTTP exporter at https://loopops.dev/v1/traces with header authorization: Bearer <producer_key> (JSON or protobuf). Full page: Node docs.

Cloudflare Workers

Native automatic tracing + approved logs → separate Workers Observability OTLP destinations · open beta · dashboard-created

// wrangler.jsonc — destination auth stays in Cloudflare, not this file
{
  "observability": {
    "traces": {
      "enabled": true,
      "destinations": ["<existing-destination>", "loopops-<project_id>-traces"]
    },
    "logs": {
      "enabled": true,
      "destinations": ["<existing-log-destination>", "loopops-<project_id>-logs"]
    }
  }
}

Have the human create the Traces destination at ingest.loopops.dev/v1/traces and, after approving application-log capture, the separate Logs destination at ingest.loopops.dev/v1/logs; both keep the producer key in Cloudflare's authorization header. Append and de-duplicate only the approved names; preserve existing sampling and persistence policy. Never point a Worker at an OTLP receiver hosted by that same Worker, which would recurse. LoopOps uses a separate receiver with no export destinations. Full page: OTLP docs.

Any language · OTLP

Python, Go, Rust, LangChain/LangGraph, collectors — standard OTLP/HTTP, JSON or protobuf

curl -sS -X POST https://loopops.dev/v1/traces \
  -H 'authorization: Bearer <producer_key>' \
  -H 'content-type: application/json' \
  -d '{"resourceSpans":[{"resource":{"attributes":[{"key":"service.name","value":{"stringValue":"my-app"}}]},"scopeSpans":[{"spans":[{"traceId":"0af7651916cd43dd8448eb211c80319c","spanId":"b7ad6b7169203331","name":"first_signal","status":{"code":1}}]}]}]}'

Every official OpenTelemetry SDK exports here: set the exporter endpoint to https://loopops.dev/v1/traces and the authorization header. No first-class LangChain/LangGraph integration — their OpenTelemetry instrumentation over this same path is the honest route. All three pillars: /v1/traces, /v1/logs, /v1/metrics (OTLP/HTTP only — no gRPC). Full page: OTLP docs.

3 · Prove it — before anything deploys

Trigger one call through the wiring you just added — or don't wait: send one smoke-test span from your terminal right now (works on every stack, ids are examples):

curl -sS -X POST https://loopops.dev/v1/traces \
  -H 'authorization: Bearer <producer_key>' \
  -H 'content-type: application/json' \
  -d '{"resourceSpans":[{"resource":{"attributes":[{"key":"service.name","value":{"stringValue":"my-app"}}]},"scopeSpans":[{"spans":[{"traceId":"0af7651916cd43dd8448eb211c80319c","spanId":"b7ad6b7169203331","name":"first_signal","status":{"code":1}}]}]}]}'

status: "receiving" means your signal was accepted — proof is immediate, no deploy needed. Reads (console, diagnosis) roll ~60–90s behind ingest.

curl -sS https://loopops.dev/v1/ingest/health \
  -H 'authorization: Bearer <producer_key>'

Says no_events? Nothing keyed to the project has reached ingest — send the smoke span above. Rejected requests carry their exact reason here. Then run your first diagnosis: POST /v1/runs/diagnose with the agent_key, or open your console link.

The long-form spelling of every step — sessions, feedback, evals, the loop itself: the quickstart and the docs.

After the handoff
Keep the project

Your agent hands you a project_id and recovery code. Sign in with your email (one-time PIN) and claim it — the project joins your account and becomes permanent (ingest is free and unlimited).

Keep improving from the same agent

The plugin or skill and mcp.loopops.dev were installed before onboarding began. Start the next session with a bounded quick check, or ask the same agent to run a governed improvement cycle and verify the next telemetry window.