Open source

BullMQ monitoring with anomaly
detection and Slack alerts.

Catches stuck jobs, predicts Redis OOM, groups errors by root cause, and alerts you in Slack before your users notice. Open source. Zero code changes. Just point it at Redis.

$npx damasqas --redis redis://localhost:6379copy
localhost:3888 · auto-discovers all queues · Docker available
localhost:3888
damasqas
Redis connected
412MB / 1GB · 4,892 ops/s
Real problems

What breaks in BullMQ

Every feature exists because real teams hit these problems in production. Sourced from GitHub issues on the BullMQ repo.

Capabilities

Everything you need. Nothing you don't.

Event timeline

What happened at 2:14 AM?

Every job lifecycle event. Chronological. Filterable. Searchable. Bull-board shows you what's happening now. Damasqas shows you what happened, when, and why.

14:32:01
completed email-send #4521 (1.2s process, 0.3s wait)
14:32:00
failed email-send #4519
TypeError: Cannot read 'email' of undefined
14:31:58
completed email-send #4518 (1.1s process, 0.4s wait)
14:31:55
stalled email-send #4515 (active 45s, lock expired)
14:31:52
active email-send #4519 (picked up by worker-2)
14:31:50
added email-send #4521 (delayed: 5000ms)
14:31:48
completed webhook-deliver #8912 (0.4s process, 0.1s wait)
⋮ 4,892 more events today
Persisted locally in SQLite. Survives Redis stream trimming. Replay any time window.
Slack integration

Alerts that tell you everything.

Failure spike alert
Included in the open-source tool. No cloud account required.
Damasqas CloudPaid

AI root cause analysis.

Connect your GitHub. When an anomaly fires, Damasqas correlates it with recent commits and identifies which code change likely caused it.

email-send failure spike 92% confidence
What happened
312 of 347 failures share the same TypeError.

Commit abc123 by @shivam modified workers/email.ts 4 min before the spike.

3rd incident from this file in 30 days.
Suggested fix
// workers/email.ts:47
// before:
const email = job.data.user.email;
// after:
const user = await db.users
  .findById(job.data.userId);
const email = user?.email;
if (!email) {
  throw new Error(
    `No email for ${job.data.userId}`
  );
}
Pricing
FAQ