Now liveThe Skillselion MCP - thousands of ranked skills, loaded into your agent mid-task. No install.Get it →
avifenesh avatar

Glide Mq Migrate Bee

  • 3 installs
  • 93 repo stars
  • Updated August 4, 2026
  • avifenesh/glide-mq

glide-mq-migrate-bee is a Claude Code skill that migrates Node.js applications from Bee-Queue to glide-mq.

About

This skill guides migrating a Node.js application from Bee-Queue to glide-mq. It maps Bee-Queue's chained job builder to glide-mq's options API, separates the single Queue class into a Queue producer and Worker consumer, and provides tables for queue settings, methods and events. It also documents the reasons to migrate, such as Bee-Queue being unmaintained and lacking cluster support, TLS and workflows. A developer uses it when replacing Bee-Queue in an existing project.

  • Step-by-step Bee-Queue to glide-mq migration with API, settings and event mapping tables
  • Separates Bee-Queue's single Queue into glide-mq Queue (producer) and Worker (consumer)
  • Documents why to migrate: Bee-Queue unmaintained since 2021, no cluster, no TLS, no workflows

Glide Mq Migrate Bee by the numbers

  • 3 all-time installs (skills.sh)
  • Ranked #3,739 of 4,347 Backend & APIs skills by installs in the Skillselion catalog
  • Data as of Aug 5, 2026 (Skillselion catalog sync)
At a glance

glide-mq-migrate-bee capabilities & compatibility

Capabilities
refactoring · api development
Works with
redis
Use cases
refactoring · api development
Pricing
Free
From the docs

What glide-mq-migrate-bee says it does

Bee-Queue uses a chained job builder pattern - this migration requires rewriting job creation and separating producer/consumer concerns.
SKILL.md
glide-mq provides all Bee-Queue features plus 35%+ higher throughput
SKILL.md
npx skills add https://github.com/avifenesh/glide-mq --skill glide-mq-migrate-bee

Add your badge

Show developers this skill is listed on Skillselion. Paste this into your README.

Listed on Skillselion
Installs3
repo stars93
Last updatedAugust 4, 2026
Repositoryavifenesh/glide-mq

What it does

Migrate a Node.js project from Bee-Queue to glide-mq using the API, settings and event mapping tables.

Who is it for?

Replacing Bee-Queue with glide-mq in an existing Node.js project

Skip if: Greenfield queue setups with no existing Bee-Queue code

When should I use this skill?

When converting bee-queue projects to glide-mq or planning a bee-queue migration

What you get

Bee-Queue producer/consumer code converted to glide-mq's Queue and Worker with equivalent settings and events

By the numbers

  • Bee-Queue last release in 2021
  • glide-mq claims 35%+ higher throughput than Bee-Queue

Files

SKILL.mdMarkdownGitHub ↗

Migrate from Bee-Queue to glide-mq

When to Apply

Use this skill when:

  • Replacing bee-queue with glide-mq in an existing project
  • Converting Bee-Queue's chained job API to glide-mq's options API
  • Updating connection configuration from ioredis to valkey-glide
  • Upgrading from bee-queue due to Node.js compatibility or maintenance issues

Step-by-step guide for converting Bee-Queue projects to glide-mq. Bee-Queue uses a chained job builder pattern - this migration requires rewriting job creation and separating producer/consumer concerns.

Why Migrate

  • Unmaintained - last release 2021, accumulating Node.js compatibility issues
  • No cluster support - cannot scale beyond a single Redis instance
  • No TLS - requires manual ioredis workarounds for encrypted connections
  • No native TypeScript - community @types/bee-queue only, often outdated
  • No priority queues - workaround is multiple queues
  • No workflows - no parent-child jobs, no DAGs, no repeatable/cron jobs
  • No rate limiting, batch processing, or broadcast
  • glide-mq provides all Bee-Queue features plus 35%+ higher throughput

Breaking Changes Summary

FeatureBee-Queueglide-mq
Queue + WorkerSingle Queue classSeparate Queue (producer) and Worker (consumer)
Job creationqueue.createJob(data).save() (chained)queue.add(name, data, opts) (single call)
Job nameNot used - no name parameterRequired first argument to queue.add()
Job optionsChained: .timeout(ms).retries(n)Options object: { attempts, backoff, delay }
Retries.retries(n){ attempts: n } (different name!)
Processingqueue.process(concurrency, handler)new Worker(name, handler, { concurrency })
Connection{ host, port } or redis URL{ addresses: [{ host, port }] }
Progressjob.reportProgress(anyJSON)`job.updateProgress(number \
Per-job eventsjob.on('succeeded', ...)QueueEvents class (centralized)
Stall detectionManual checkStalledJobs()Automatic on Worker
Batch savequeue.saveAll(jobs)queue.addBulk(jobs)
Producer-only{ isWorker: false }Producer class or just Queue

Queue Settings Mapping

Bee-Queue SettingDefaultglide-mq EquivalentNotes
redis{}connection: { addresses: [...] }Array of { host, port } objects
isWorkertrueUse Producer or Queue classSeparate classes replace flag
getEventstrueUse QueueEvents classSeparate class for event subscription
sendEventstrueevents: true on WorkerControls lifecycle event emission
storeJobstrueAlways trueglide-mq always stores jobs
ensureScriptstrueAutomaticServer Functions loaded automatically
activateDelayedJobsfalseAutomaticServer-side delayed job activation
removeOnSuccessfalse{ removeOnComplete: true }Per-job option on queue.add()
removeOnFailurefalse{ removeOnFail: true }Per-job option on queue.add()
stallInterval5000lockDuration on WorkerLock-based stall detection
nearTermWindow20minN/AValkey-native delayed processing
delayedDebounce1000N/AServer-side scheduling
prefix'bq'prefix on QueueDefault: 'glide'
quitCommandClienttrueAutomaticHandled by graceful shutdown
redisScanCount100N/ADifferent key strategy

Queue Method Mapping

Bee-Queue Methodglide-mq EquivalentNotes
queue.createJob(data)queue.add(name, data, opts)Name is required; returns Job not builder
queue.process(n, handler)new Worker(name, handler, { concurrency: n })Separate class
queue.checkStalledJobs(interval)Automatic on WorkerNo manual call needed
queue.checkHealth()queue.getJobCounts()Returns { waiting, active, completed, failed, delayed }
queue.close()gracefulShutdown([...])Or individual .close() calls
queue.ready()worker.waitUntilReady()On Worker, not Queue
queue.isRunning()worker.isRunning()On Worker
queue.getJob(id)queue.getJob(id)Same API
queue.getJobs(type, page)queue.getJobs(type, start, end)Range-based pagination
queue.removeJob(id)(await queue.getJob(id)).remove()Via Job instance
queue.saveAll(jobs)queue.addBulk(jobs)Different input format
queue.destroy()queue.obliterate()Removes all queue data

Event Mapping

Bee-Queue EventSourceglide-mq EquivalentSource
queue.on('ready')Queueworker.waitUntilReady()Worker
queue.on('error', err)Queueworker.on('error', err)Worker
queue.on('succeeded', job, result)Queue (local)worker.on('completed', job)Worker
queue.on('retrying', job, err)Queue (local)worker.on('failed', job, err)Worker (with retries remaining)
queue.on('failed', job, err)Queue (local)worker.on('failed', job, err)Worker
queue.on('stalled', jobId)Queueworker.on('stalled', jobId)Worker
queue.on('job succeeded', id, result)Queue (PubSub)events.on('completed', { jobId })QueueEvents
queue.on('job failed', id, err)Queue (PubSub)events.on('failed', { jobId })QueueEvents
queue.on('job retrying', id, err)Queue (PubSub)No direct equivalentUse events.on('failed') + retry check
queue.on('job progress', id, data)Queue (PubSub)events.on('progress', { jobId, data })QueueEvents
job.on('succeeded', result)Jobevents.on('completed', { jobId })QueueEvents (filter by jobId)
job.on('failed', err)Jobevents.on('failed', { jobId })QueueEvents (filter by jobId)
job.on('progress', data)Jobevents.on('progress', { jobId })QueueEvents (filter by jobId)

Per-job events (job.on(...)) do not exist in glide-mq. Use QueueEvents and filter by jobId, or use queue.addAndWait() for request-reply patterns.

Step-by-Step Conversion

1. Connection

// BEFORE (Bee-Queue)
const Queue = require('bee-queue');
const queue = new Queue('tasks', {
  redis: { host: 'localhost', port: 6379 }
});

// AFTER (glide-mq)
import { Queue, Worker } from 'glide-mq';
const connection = { addresses: [{ host: 'localhost', port: 6379 }] };
const queue = new Queue('tasks', { connection });

2. Job Creation (Biggest Change)

Bee-Queue uses chained builder with no job name. glide-mq uses a single call with a required name.

// BEFORE (Bee-Queue) - chained builder, no name
const job = await queue.createJob({ email: 'user@example.com' })
  .retries(3)
  .backoff('exponential', 1000)
  .delayUntil(Date.now() + 60000)
  .setId('unique-123')
  .save();

// AFTER (glide-mq) - options object, name required
await queue.add('send-email',
  { email: 'user@example.com' },
  {
    attempts: 3,  // NOT "retries" - different name!
    backoff: { type: 'exponential', delay: 1000 },
    delay: 60000,
    jobId: 'unique-123',
  }
);

3. Worker

// BEFORE (Bee-Queue)
queue.process(10, async (job) => {
  return { processed: true };
});
queue.on('succeeded', (job, result) => console.log('Done:', result));

// AFTER (glide-mq) - separate Worker class
const worker = new Worker('tasks', async (job) => {
  return { processed: true };
}, { connection, concurrency: 10 });
worker.on('completed', (job) => console.log('Done:', job.returnValue));

4. Batch Save

// BEFORE (Bee-Queue)
const jobs = items.map(item => queue.createJob(item));
await queue.saveAll(jobs);

// AFTER (glide-mq) - each entry needs a name
await queue.addBulk(items.map(item => ({
  name: 'process',
  data: item
})));

5. Producer-Only

// BEFORE (Bee-Queue) - disable worker mode
const queue = new Queue('tasks', {
  isWorker: false, getEvents: false, sendEvents: false,
  redis: { host: 'localhost', port: 6379 }
});

// AFTER (glide-mq) - Producer class
import { Producer } from 'glide-mq';
const producer = new Producer('tasks', { connection });
await producer.add('job-name', data);
await producer.close();

6. Progress Reporting

// BEFORE (Bee-Queue) - arbitrary JSON
queue.process(async (job) => {
  job.reportProgress({ percent: 50, message: 'halfway' });
  return result;
});

// AFTER (glide-mq) - number (0-100) or object
const worker = new Worker('tasks', async (job) => {
  await job.updateProgress(50);
  await job.updateProgress({ page: 3, total: 10 });  // objects also supported
  await job.log('halfway done');  // structured info goes to job.log()
  return result;
}, { connection });

7. Stall Detection

// BEFORE (Bee-Queue) - manual setup required
const queue = new Queue('tasks', { stallInterval: 5000 });
queue.checkStalledJobs(5000);  // must call manually!

// AFTER (glide-mq) - automatic on Worker
const worker = new Worker('tasks', processor, {
  connection,
  lockDuration: 30000,
  stalledInterval: 30000,
  maxStalledCount: 2
});
// Stall detection runs automatically - no manual call

8. Health Check

// BEFORE (Bee-Queue)
const health = await queue.checkHealth();
// { waiting, active, succeeded, failed, delayed, newestJob }

// AFTER (glide-mq)
const counts = await queue.getJobCounts();
// { waiting, active, completed, failed, delayed }

9. Web UI (Arena to Dashboard)

// BEFORE (Bee-Queue) - Arena
const Arena = require('bull-arena');
app.use('/', Arena({ Bee: require('bee-queue'), queues: [{ name: 'tasks' }] }));

// AFTER (glide-mq) - Dashboard
import { createDashboard } from '@glidemq/dashboard';
app.use('/dashboard', createDashboard([queue]));

What You Gain

Features Bee-Queue does not have that are available after migration:

Featureglide-mq API
Priority queues{ priority: 0 } (lower = higher, 0 is highest)
FlowProducerParent-child job trees and DAG workflows
BroadcastFan-out with subscriber groups
Batch processingProcess multiple jobs per worker call
DeduplicationSimple, throttle, and debounce modes
SchedulersCron patterns and interval repeatable jobs
Rate limitinglimiter: { max: 100, duration: 60000 } on Worker
LIFO modeProcess newest jobs first with { lifo: true }
Dead letter queuedeadLetterQueue: { name: 'dlq' } on Queue
Serverless poolConnection caching for Lambda/Edge
HTTP proxyCross-language queue access via REST
OpenTelemetryAutomatic span emission
Testing utilitiesTestQueue/TestWorker without Valkey
Cluster supportHash-tagged keys, AZ-affinity routing
TLS / IAM authuseTLS: true, IAM credentials for ElastiCache
Native TypeScriptFull generic type support throughout
AI usage trackingjob.reportUsage({ model, tokens, costs, ... })
Token streamingjob.stream() / queue.readStream() for real-time LLM output
Suspend/resumejob.suspend() / queue.signal() for human-in-the-loop
Flow budgetflow.add(tree, { budget: { maxTotalTokens } })
Fallback chainsopts.fallbacks: [{ model, provider }]
Dual-axis rate limitingtokenLimiter for RPM + TPM compliance
Vector searchqueue.createJobIndex() / queue.vectorSearch()

Migration Checklist

- [ ] Install glide-mq, uninstall bee-queue and @types/bee-queue
- [ ] Create connection config (addresses array format)
- [ ] Convert queue.createJob().save() to queue.add(name, data, opts)
- [ ] Add job names to every queue.add() call (Bee-Queue had none)
- [ ] Convert .retries(n) to { attempts: n } (different name!)
- [ ] Convert .backoff(strategy, delay) to { backoff: { type, delay } }
- [ ] Convert .delayUntil(date) to { delay: ms }
- [ ] Convert .setId(id) to { jobId: id }
- [ ] Convert queue.process() to new Worker()
- [ ] Convert queue.saveAll() to queue.addBulk()
- [ ] Separate producer queues (isWorker:false to Producer class)
- [ ] Convert job.reportProgress(json) to job.updateProgress(number | object)
- [ ] Remove manual checkStalledJobs() calls (automatic on Worker)
- [ ] Convert checkHealth() to getJobCounts()
- [ ] Update event listeners (queue.on to worker.on or QueueEvents)
- [ ] Convert per-job events (job.on) to QueueEvents
- [ ] Keep the project's existing module system (CommonJS or ESM)
- [ ] Run full test suite
- [ ] Confirm queue counts: await queue.getJobCounts()
- [ ] Confirm no jobs stuck in active state
- [ ] Smoke-test QueueEvents or SSE listeners if the app exposes them
- [ ] Confirm workers, queues, and connections close cleanly

Troubleshooting

ErrorCauseFix
queue.createJob is not a functionAPI changedUse queue.add(name, data, opts)
queue.process is not a functionSeparated producer/consumerUse new Worker(name, handler, opts)
Cannot use require()Module system mismatchKeep the project's existing module system; glide-mq supports CommonJS and ESM
job.reportProgress is not a functionAPI renamedUse job.updateProgress(number)
Cannot find module 'bee-queue'Leftover importgrep -r "bee-queue" src/ to find remaining
Missing job nameBee-Queue had no nameAdd a name as first arg to queue.add()
retries option not recognizedDifferent nameUse attempts not retries
No stall detectionBee-Queue needed manual startglide-mq runs it automatically on Worker
Progress type changedBee-Queue accepted any JSONUse `job.updateProgress(number \
Per-job events not workingNo per-job events in glide-mqUse QueueEvents class and filter by jobId

Quick Start Commands

npm uninstall bee-queue @types/bee-queue
npm install glide-mq

References

DocumentContent
references/api-mapping.mdComplete method-by-method API mapping
references/new-features.mdFeatures available after migration

Related skills

FAQ

What is the biggest change from Bee-Queue?

Bee-Queue's single Queue class splits into a separate Queue (producer) and Worker (consumer), and chained job creation becomes a single queue.add(name, data, opts) call.

Why migrate off Bee-Queue?

The skill cites Bee-Queue being unmaintained since 2021, no cluster support, no TLS, no native TypeScript, no priority queues and no workflows.

Backend & APIsbackendintegrations

This week in AI coding

Five minutes, every Monday - the tools, releases and tactics for developers.

unsubscribe anytime.