Monitoring for any stack, built on OpenTelemetry

Know what broke, where, and since which deploy.

Traces, logs, errors, metrics, uptime checks and status pages, fed by whatever you already run. AdonisJS apps get a first-party agent that instruments routes, queries, jobs and mail on install.

  • AdonisJS
  • Express
  • Fastify
  • Hono
  • NestJS
  • Next.js
  • Python
  • Go
  • Ruby
  • PHP
  • Java
  • .NET

One bad deploy, minute by minute.

How an outage reads in Unhandled, from the first slow request to the status update. Each screen below is the real product running on sample data.

  1. A checkout request crawls

    Every request arrives as a trace: the route, each query, the outbound calls and the mail it sent, on one timeline. The slow part is the wide bar.

  2. Stripe throws

    The exception joins an issue with its stack, the trace that raised it, the users it reached and the release it first showed up in. Assign it, discuss it, link it to GitHub or Linear.

  3. The health check fails

    Uptime monitors call your public endpoints every minute from outside your network and open an incident when failures repeat.

  4. Customers can see it too

    Your public status page reads from the same monitors, so it changes when the service does. Post updates as you work, on a domain of your own if you want one.

  5. Someone gets told

    Threshold alerts on p95 latency, error rate and throughput post to Slack, Discord or a webhook, and land in each member’s inbox.

  6. You ask from your editor

    The built-in MCP server lets Claude, Cursor or any MCP client read issues, traces and deployments and post status updates for you.

    you
    Which release started the Stripe errors on billing-api?
    tools
    get_issue · list_occurrences · list_deployments
    you
    Tell the status page we rolled back and are watching.
    tools
    update_status_incident

Your stack, your exporter.

AdonisJS installs the full agent with one command. Node.js frameworks load an SDK, and every other language keeps its standard OpenTelemetry SDK.

The snippets use a sample DSN. Each service page fills in its own.

Unhandled SDKs

OpenTelemetry SDKs

Coding agents

Already on Sentry

Keep the official package and point its OTLP exporter at Unhandled. The Unhandled agent adds Lucid query, mail, queue and Ace command spans, exception source lines and job sampling. Guide

  1. 1

    Set up @adonisjs/otel if it is not there yet

    bash
    node ace add @adonisjs/otel

    Writes config/otel.ts and otel.ts, imports otel.js first in bin/server.ts, and registers the provider and middleware. If bin/server.ts imports @adonisjs/core statically, load it with await import() after otel.js, or requests are not traced.

  2. 2

    Point the exporter at Unhandled

    .env
    OTEL_SERVICE_NAME=orders-api
    OTEL_EXPORTER_OTLP_ENDPOINT=https://ingest.example.com
    OTEL_EXPORTER_OTLP_PROTOCOL=http/protobuf
    OTEL_EXPORTER_OTLP_HEADERS=x-api-key=uh_live_7Hq2xR9vLp3sKd8mWn4tYb6c,x-unhandled-service-id=0b6f3c1e-8d2a-4f7b-9c5e-2a1d4e6f8b3c,x-unhandled-env=production
    APP_ENV=production

    The generated config passes APP_NAME as the service name, which wins over OTEL_SERVICE_NAME. Unhandled files the data under this service either way.

  3. 3

    Start the app and send a request

    bash
    node ace build
    node build/bin/server.js

    The build does not copy .env, so set the variables where the server runs.

The short version.

Ingest
OTLP over HTTP. Any OpenTelemetry SDK or Collector can export to it with three headers taken from your DSN.
Runtimes
SDKs for Express, Fastify, Hono, NestJS and Next.js. Python, Go, Ruby, PHP, Java and .NET use their standard OpenTelemetry SDK.
AdonisJS
A first-party agent for versions 6 and 7. One command writes the config and wires routes, Lucid, mail, queue jobs and Ace commands.
Signals
Traces, logs, exceptions grouped into issues, metrics, deployments, uptime checks and public status pages.
Notifications
Slack, Discord, signed webhooks, email and an in-app inbox for every member.
Retention
30 days on Starter, 90 days on Business.
Leaving
Your instrumentation is plain OpenTelemetry. Point the exporter somewhere else and nothing in your code changes.

Priced by the data you send

Every feature on every plan. 14-day trial.

  • Starter€25/ month50 GB included · 30 days kept · €0.35 per extra GB
  • Business€79/ month200 GB included · 90 days kept · €0.30 per extra GB
Compare plans and yearly billing

Point your exporter here before the next deploy.

One DSN, and the next request your app serves shows up as a trace.