01·Install + mount
// shell
$ pnpm add @workspace/debugsy
// app root — ↓ panel below = this same component
import { DebugsyLook } from "@workspace/debugsy"
<DebugsyLook />
02·Logs config
registerModule("auth", {
label: "Auth",
emoji: "🔐",
description: "session · login · refresh",
// each key → debug point: auth.<key>
points: {
session: { emoji: "🔑", label: "Session" },
login: { emoji: "→", label: "Login" },
refresh: { emoji: "↻", label: "Refresh" },
},
})
03·Logging
// (point, message, data?, tags?) · .log .warn .error .critical · .time / .timeEnd
// hook · stable, in components
const debug = useDebugsy()
debug.log("rt.conn", "synced", { roomId })
// const · eager, anywhere
dsy.warn("auth.session", "expired", { ttl })
// fn · lazy, anywhere
getDebugsy().error("api.fetch", "5xx", err)
// global · browser console
window.debugsy.critical("render.loop", "runaway")
04·Re-render cause tracing
// shallow-equality diff over the watched bag,
// emitted as a debug log entry on every commit.
useWhyDidYouUpdate("Form", { values, errors, onSubmit })
05·Reference instability detection
// counts renders, tracks identity-stability of deps,
// alerts when renderThreshold or mountThreshold is hit.
useRenderTracker("Modal", [open, items, onClose], {
renderThreshold: 10, // default
mountThreshold: 3, // default
onExcessiveRenders: (info) => debug.warn("render.rate", "hot", info),
})
06·Zero production cost
// tree-shaken when NODE_ENV=production. no runtime,
// no global hooks, no telemetry, no network.
if (process.env.NODE_ENV !== "production") {
await import("@workspace/debugsy/dev")
}