@coderadar/sdk. ESM + CJS dual build. Auto-instruments Express, Hono, Next.js, Fastify, Koa. Tested on Node 20, 22, 24.
pnpm add @coderadar/sdk
# package.json
"@coderadar/sdk": "^0.4"
import { init } from "@coderadar/sdk";
init({
dsn: process.env.CODERADAR_DSN,
project: "truecom",
environment: process.env.NODE_ENV,
release: process.env.RELEASE_SHA,
sampleRate: 1.0, // errors — keep at 1.0
tracesSampleRate: 0.2, // 20% of traces
debug: false, // SDK self-logging to stderr
beforeSend: (ev) => ev, // optional event mutator
});
| Option | Default | Notes |
|---|---|---|
dsn | — | Required. Falls back to CODERADAR_DSN. |
project | — | Project slug. Required if not in DSN. |
environment | "production" | Free-form. Convention: dev / staging / production / preview-*. |
release | — | SHA or semver. Used for grouping + regression detection. |
sampleRate | 1.0 | Errors. Keep at 1.0 unless you really need to drop. |
tracesSampleRate | 0.0 | 0 = no traces. 1.0 = every trace. |
debug | false | SDK self-logging. |
beforeSend | — | Mutator. Return null to drop. Strip PII here. |
integrations | auto | Override the auto-instrumentation list. |
maxBreadcrumbs | 100 | Per-event buffer. |
tags | — | Default tags applied to every event. |
import express from "express";
import { errorHandler, requestHandler } from "@coderadar/sdk/express";
const app = express();
app.use(requestHandler()); // adds trace context, user context
// ... your routes
app.use(errorHandler()); // captures unhandled errors
import { Hono } from "hono";
import { honoMiddleware } from "@coderadar/sdk/hono";
const app = new Hono();
app.use("*", honoMiddleware({ project: "relayone" }));
// instrumentation.ts
export async function register() {
if (process.env.NEXT_RUNTIME === "nodejs") {
const { init } = await import("@coderadar/sdk");
init({
dsn: process.env.CODERADAR_DSN,
project: "truecom",
release: process.env.VERCEL_GIT_COMMIT_SHA,
});
}
if (process.env.NEXT_RUNTIME === "edge") {
// edge-runtime build is leaner; only error capture, no traces
const { initEdge } = await import("@coderadar/sdk/edge");
initEdge({ dsn: process.env.CODERADAR_DSN, project: "truecom" });
}
}
// app/global-error.tsx
"use client";
import { captureException } from "@coderadar/sdk";
export default function GlobalError({ error }) {
captureException(error);
return <html>...</html>;
}
import {
captureException, captureMessage,
setUser, setTag, addBreadcrumb,
withScope,
} from "@coderadar/sdk";
setUser({ id: user.id, segment: user.tier });
setTag("region", "us-central1");
addBreadcrumb({ category: "checkout", message: "opened cart" });
try {
await finalizeCheckout(cart);
} catch (err) {
captureException(err, { tags: { stage: "checkout" } });
throw err;
}
withScope((scope) => {
scope.setTag("cron_job", "drift_scan");
captureMessage("Drift scan started", "info");
});
import pino from "pino";
import { pinoTransport } from "@coderadar/sdk/transports";
const logger = pino({
transport: { target: pinoTransport, options: { level: "error" } },
});
The SDK buffers events in memory (1 MB by default) and flushes every 5 seconds or when the buffer fills. On graceful shutdown, call await flush(2000) with a timeout in milliseconds. close() is the synchronous variant; use it inside process.on("beforeExit") when you can't await.
Errors default to sampleRate: 1.0 — capture everything. Traces default to tracesSampleRate: 0.0; set it explicitly. Adaptive sampling kicks in if the project is over its quota; the SDK respects the server's X-CodeRadar-Sample-Rate response header.
The default beforeSend strips fields named authorization, cookie, password, token, api_key, creditCard. Override or extend by passing your own beforeSend in the init options.