bugbear
v1.0.2
Published
> a persistent source of annoyance — now useful
Downloads
95
Readme
bugbear
a persistent source of annoyance — now useful
Debug event logger and live navigator for Bare. Log structured events to a JSONL file from anywhere in your app, then browse them in a ranger-style TUI — drill into objects, filter, select, and page through data.
Designed for debugging and inspecting, not for production use.
Usage
- Install bugbear:
npm install bugbear- Add
bugbearto your project globally:
require('bugbear')- Log events:
__bugbear('hyperswarm')({ event: 'peer-added', peers: 4 })
__bugbear('hyperswarm')({ level: 'error', msg: 'connection refused', code: 111 })
// re-usable logger
const logs = __bugbear('hyperswarm')
logs({ event: 'peer-added', peers: 4 })
logs({ level: 'error', msg: 'connection refused', code: 111 })- Run your app and open the resulting JSONL file in the TUI.
node ./app.js && bugbear
This will append the log file to ./bugbear.jsonl, and open it in the TUI.
bugbear(scope) returns a scoped logger. Every call captures a stack trace. level is optional — include it as a key if you want it.
Buffers, Maps, Sets, and BigInts are serialized safely and restored when browsing.
Nested scopes
const log = bugbear(['hyperswarm', 'peers'])
log({ event: 'connected', id })Nested scopes appear as drillable nodes in the navigator.
Custom log file
const log = bugbear('hyperswarm', { file: './debug.jsonl' })The default file is ./bugbear.jsonl.
Global
__bugbear is available everywhere without passing it around:
require('bugbear')
const log = __bugbear('hyperswarm')
log({ event: 'peer-added', peers: 4 })
// or
__bugbear('hyperswarm')({ event: 'peer-added', peers: 4 })bugbear registers itself at globalThis.__bugbear — one instance shared across every module, no matter how many times it's required.
Navigator
Run the CLI to browse your logs:
bugbear # open ./bugbear.jsonl
bugbear ./debug.jsonl # open a specific file
bugbear --file ./debug.jsonlThe navigator watches the file for new entries and updates live. It works with any JSONL file — bugbear's own format is just regular JSONL with special-type encoding.
The three-column layout shows parent | current | preview. The current path is shown at the top.
Keys
| key | action |
| ------------------- | --------------------------------------------------------------- |
| j / ↓ | down |
| k / ↑ | up |
| l / → / enter | drill in |
| h / ← / esc | go up |
| g | top |
| G | bottom |
| s | toggle selection on current item |
| v | visual mode — range select |
| c | clear all selections |
| / | filter — type regex, enter to confirm, esc to clear |
| m | map — type a dot-path to preview a sub-field across all items |
| p | pager — scrollable expanded view of selected (or current) items |
| x | cycle buffer and timestamp encoding: hex → z32 → raw |
| q / ctrl+c | exit |
Filter and map compose: /\d to narrow to numeric keys, then m + latency to show just that field across every item in the preview column.

License
Apache-2.0
