@harikalyan/capture-duck
v0.1.1
Published
Browser and Node error capture: stack parsing, optional PostHog, pluggable ingest.
Readme
@harikalyan/capture-duck
Capture JavaScript errors in the browser and Node, normalize stack traces, optionally forward to PostHog, and send browser payloads to your own HTTP ingest (you own the URL, API keys, and database).
Install
npm install @harikalyan/capture-duckOptional (browser only), for PostHog:
npm install posthog-jsBrowser
Use fetch (no axios) to POST JSON to ingestUrl. Global window.onerror / onunhandledrejection handlers fire captureDuck without awaiting so the UI is not blocked.
import posthog from "posthog-js";
import {
buildPosthogInitOptions,
initErrorTracking,
captureDuck,
} from "@harikalyan/capture-duck/browser";
posthog.init(MY_KEY, buildPosthogInitOptions({ apiKey: MY_KEY, host: MY_HOST }));
await initErrorTracking({
ingestUrl: "https://api.example.com/errors",
getIngestHeaders: () => ({ Authorization: `Bearer ${token}` }),
posthogClient: posthog,
timeoutMs: 8000,
beforeSend: (payload) => payload,
});
const { ingest } = await captureDuck(err, { context: "checkout" });
if (ingest?.ok) {
console.log(ingest.data);
}Node / backend
No database is bundled into the package. You pass a report function that persists the payload (Convex, Prisma, HTTP, etc.).
import { createCaptureDuck } from "@harikalyan/capture-duck/node";
const captureDuck = createCaptureDuck({
report: async (payload) => {
await db.errors.insert(payload);
},
environment: process.env.NODE_ENV,
});Security notes
- Browser: use only the public PostHog project key (
phc_...). - Put secrets on your server or in
getIngestHeaders, not in frontend bundles.
License
MIT
