{"id":"f1a3fdb0-587c-4bf5-ac36-aaf80464fb68","shortId":"Mb83k4","kind":"skill","title":"Bullmq Specialist","tagline":"Antigravity Awesome Skills skill by Sickn33","description":"# BullMQ Specialist\n\nBullMQ expert for Redis-backed job queues, background processing, and\nreliable async execution in Node.js/TypeScript applications.\n\n## Principles\n\n- Jobs are fire-and-forget from the producer side - let the queue handle delivery\n- Always set explicit job options - defaults rarely match your use case\n- Idempotency is your responsibility - jobs may run more than once\n- Backoff strategies prevent thundering herds - exponential beats linear\n- Dead letter queues are not optional - failed jobs need a home\n- Concurrency limits protect downstream services - start conservative\n- Job data should be small - pass IDs, not payloads\n- Graceful shutdown prevents orphaned jobs - handle SIGTERM properly\n\n## Capabilities\n\n- bullmq-queues\n- job-scheduling\n- delayed-jobs\n- repeatable-jobs\n- job-priorities\n- rate-limiting-jobs\n- job-events\n- worker-patterns\n- flow-producers\n- job-dependencies\n\n## Scope\n\n- redis-infrastructure -> redis-specialist\n- serverless-queues -> upstash-qstash\n- workflow-orchestration -> temporal-craftsman\n- event-sourcing -> event-architect\n- email-delivery -> email-systems\n\n## Tooling\n\n### Core\n\n- bullmq\n- ioredis\n\n### Hosting\n\n- upstash\n- redis-cloud\n- elasticache\n- railway\n\n### Monitoring\n\n- bull-board\n- arena\n- bullmq-pro\n\n### Patterns\n\n- delayed-jobs\n- repeatable-jobs\n- job-flows\n- rate-limiting\n- sandboxed-processors\n\n## Patterns\n\n### Basic Queue Setup\n\nProduction-ready BullMQ queue with proper configuration\n\n**When to use**: Starting any new queue implementation\n\nimport { Queue, Worker, QueueEvents } from 'bullmq';\nimport IORedis from 'ioredis';\n\n// Shared connection for all queues\nconst connection = new IORedis(process.env.REDIS_URL, {\n  maxRetriesPerRequest: null,  // Required for BullMQ\n  enableReadyCheck: false,\n});\n\n// Create queue with sensible defaults\nconst emailQueue = new Queue('emails', {\n  connection,\n  defaultJobOptions: {\n    attempts: 3,\n    backoff: {\n      type: 'exponential',\n      delay: 1000,\n    },\n    removeOnComplete: { count: 1000 },\n    removeOnFail: { count: 5000 },\n  },\n});\n\n// Worker with concurrency limit\nconst worker = new Worker('emails', async (job) => {\n  await sendEmail(job.data);\n}, {\n  connection,\n  concurrency: 5,\n  limiter: {\n    max: 100,\n    duration: 60000,  // 100 jobs per minute\n  },\n});\n\n// Handle events\nworker.on('failed', (job, err) => {\n  console.error(`Job ${job?.id} failed:`, err);\n});\n\n### Delayed and Scheduled Jobs\n\nJobs that run at specific times or after delays\n\n**When to use**: Scheduling future tasks, reminders, or timed actions\n\n// Delayed job - runs once after delay\nawait queue.add('reminder', { userId: 123 }, {\n  delay: 24 * 60 * 60 * 1000,  // 24 hours\n});\n\n// Repeatable job - runs on schedule\nawait queue.add('daily-digest', { type: 'summary' }, {\n  repeat: {\n    pattern: '0 9 * * *',  // Every day at 9am\n    tz: 'America/New_York',\n  },\n});\n\n// Remove repeatable job\nawait queue.removeRepeatable('daily-digest', {\n  pattern: '0 9 * * *',\n  tz: 'America/New_York',\n});\n\n### Job Flows and Dependencies\n\nComplex multi-step job processing with parent-child relationships\n\n**When to use**: Jobs depend on other jobs completing first\n\nimport { FlowProducer } from 'bullmq';\n\nconst flowProducer = new FlowProducer({ connection });\n\n// Parent waits for all children to complete\nawait flowProducer.add({\n  name: 'process-order',\n  queueName: 'orders',\n  data: { orderId: 123 },\n  children: [\n    {\n      name: 'validate-inventory',\n      queueName: 'inventory',\n      data: { orderId: 123 },\n    },\n    {\n      name: 'charge-payment',\n      queueName: 'payments',\n      data: { orderId: 123 },\n    },\n    {\n      name: 'notify-warehouse',\n      queueName: 'notifications',\n      data: { orderId: 123 },\n    },\n  ],\n});\n\n### Graceful Shutdown\n\nProperly close workers without losing jobs\n\n**When to use**: Deploying or restarting workers\n\nconst shutdown = async () => {\n  console.log('Shutting down gracefully...');\n\n  // Stop accepting new jobs\n  await worker.pause();\n\n  // Wait for current jobs to finish (with timeout)\n  await worker.close();\n\n  // Close queue connection\n  await queue.close();\n\n  process.exit(0);\n};\n\nprocess.on('SIGTERM', shutdown);\nprocess.on('SIGINT', shutdown);\n\n### Bull Board Dashboard\n\nVisual monitoring for BullMQ queues\n\n**When to use**: Need visibility into queue status and job states\n\nimport { createBullBoard } from '@bull-board/api';\nimport { BullMQAdapter } from '@bull-board/api/bullMQAdapter';\nimport { ExpressAdapter } from '@bull-board/express';\n\nconst serverAdapter = new ExpressAdapter();\nserverAdapter.setBasePath('/admin/queues');\n\ncreateBullBoard({\n  queues: [\n    new BullMQAdapter(emailQueue),\n    new BullMQAdapter(orderQueue),\n  ],\n  serverAdapter,\n});\n\napp.use('/admin/queues', serverAdapter.getRouter());\n\n## Validation Checks\n\n### Redis connection missing maxRetriesPerRequest\n\nSeverity: ERROR\n\nBullMQ requires maxRetriesPerRequest null for proper reconnection handling\n\nMessage: BullMQ queue/worker created without maxRetriesPerRequest: null on Redis connection. This will cause workers to stop on Redis connection issues.\n\n### No stalled job event handler\n\nSeverity: WARNING\n\nWorkers should handle stalled events to detect crashed workers\n\nMessage: Worker created without 'stalled' event handler. Stalled jobs indicate worker crashes and should be monitored.\n\n### No failed job event handler\n\nSeverity: WARNING\n\nWorkers should handle failed events for monitoring and alerting\n\nMessage: Worker created without 'failed' event handler. Failed jobs should be logged and monitored.\n\n### No graceful shutdown handling\n\nSeverity: WARNING\n\nWorkers should gracefully shut down on SIGTERM/SIGINT\n\nMessage: Worker file without graceful shutdown handling. Jobs may be orphaned on deployment.\n\n### Awaiting queue.add in request handler\n\nSeverity: INFO\n\nQueue additions should be fire-and-forget in request handlers\n\nMessage: Queue.add awaited in request handler. Consider fire-and-forget for faster response.\n\n### Potentially large data in job payload\n\nSeverity: WARNING\n\nJob data should be small - pass IDs not full objects\n\nMessage: Job appears to have large inline data. Pass IDs instead of full objects to keep Redis memory low.\n\n### Job without timeout configuration\n\nSeverity: INFO\n\nJobs should have timeouts to prevent infinite execution\n\nMessage: Job added without explicit timeout. Consider adding timeout to prevent stuck jobs.\n\n### Retry without backoff strategy\n\nSeverity: WARNING\n\nRetries should use exponential backoff to avoid thundering herd\n\nMessage: Job has retry attempts but no backoff strategy. Use exponential backoff to prevent thundering herd.\n\n### Repeatable job without explicit timezone\n\nSeverity: WARNING\n\nRepeatable jobs should specify timezone to avoid DST issues\n\nMessage: Repeatable job without explicit timezone. Will use server local time which can drift with DST.\n\n### Potentially high worker concurrency\n\nSeverity: INFO\n\nHigh concurrency can overwhelm downstream services\n\nMessage: Worker concurrency is high. Ensure downstream services can handle this load (DB connections, API rate limits).\n\n## Collaboration\n\n### Delegation Triggers\n\n- redis infrastructure|redis cluster|memory tuning -> redis-specialist (Queue needs Redis infrastructure)\n- serverless queue|edge queue|no redis -> upstash-qstash (Need queues without managing Redis)\n- complex workflow|saga|compensation|long-running -> temporal-craftsman (Need workflow orchestration beyond simple jobs)\n- event sourcing|CQRS|event streaming -> event-architect (Need event-driven architecture)\n- deploy|kubernetes|scaling|infrastructure -> devops (Queue needs infrastructure)\n- monitor|metrics|alerting|dashboard -> performance-hunter (Queue needs monitoring)\n\n### Email Queue Stack\n\nSkills: bullmq-specialist, email-systems, redis-specialist\n\nWorkflow:\n\n```\n1. Email request received (API)\n2. Job queued with rate limiting (bullmq-specialist)\n3. Worker processes with backoff (bullmq-specialist)\n4. Email sent via provider (email-systems)\n5. Status tracked in Redis (redis-specialist)\n```\n\n### Background Processing Stack\n\nSkills: bullmq-specialist, backend, devops\n\nWorkflow:\n\n```\n1. API receives request (backend)\n2. Long task queued for background (bullmq-specialist)\n3. Worker processes async (bullmq-specialist)\n4. Result stored/notified (backend)\n5. Workers scaled per load (devops)\n```\n\n### AI Processing Pipeline\n\nSkills: bullmq-specialist, ai-workflow-automation, performance-hunter\n\nWorkflow:\n\n```\n1. AI task submitted (ai-workflow-automation)\n2. Job flow created with dependencies (bullmq-specialist)\n3. Workers process stages (bullmq-specialist)\n4. Performance monitored (performance-hunter)\n5. Results aggregated (ai-workflow-automation)\n```\n\n### Scheduled Tasks Stack\n\nSkills: bullmq-specialist, backend, redis-specialist\n\nWorkflow:\n\n```\n1. Repeatable jobs defined (bullmq-specialist)\n2. Cron patterns with timezone (bullmq-specialist)\n3. Jobs execute on schedule (bullmq-specialist)\n4. State managed in Redis (redis-specialist)\n5. Results handled (backend)\n```\n\n## Related Skills\n\nWorks well with: `redis-specialist`, `backend`, `nextjs-app-router`, `email-systems`, `ai-workflow-automation`, `performance-hunter`\n\n## When to Use\n- User mentions or implies: bullmq\n- User mentions or implies: bull queue\n- User mentions or implies: redis queue\n- User mentions or implies: background job\n- User mentions or implies: job queue\n- User mentions or implies: delayed job\n- User mentions or implies: repeatable job\n- User mentions or implies: worker process\n- User mentions or implies: job scheduling\n- User mentions or implies: async processing\n\n## Limitations\n- Use this skill only when the task clearly matches the scope described above.\n- Do not treat the output as a substitute for environment-specific validation, testing, or expert review.\n- Stop and ask for clarification if required inputs, permissions, safety boundaries, or success criteria are missing.","tags":["bullmq","specialist","antigravity","awesome","skills","sickn33"],"capabilities":["skill","source-sickn33","category-antigravity-awesome-skills"],"categories":["antigravity-awesome-skills"],"synonyms":[],"warnings":[],"endpointUrl":"https://skills.sh/sickn33/antigravity-awesome-skills/bullmq-specialist","protocol":"skill","transport":"skills-sh","auth":{"type":"none","details":{"install_from":"skills.sh"}},"qualityScore":"0.300","qualityRationale":"deterministic score 0.30 from registry signals: · indexed on skills.sh · published under sickn33/antigravity-awesome-skills","verified":false,"liveness":"unknown","lastLivenessCheck":null,"agentReviews":{"count":0,"score_avg":null,"cost_usd_avg":null,"success_rate":null,"latency_p50_ms":null,"narrative_summary":null,"summary_updated_at":null},"enrichmentModel":"deterministic:skill:v1","enrichmentVersion":1,"enrichedAt":"2026-04-25T11:40:47.466Z","embedding":null,"createdAt":"2026-04-18T20:34:43.061Z","updatedAt":"2026-04-25T11:40:47.466Z","lastSeenAt":"2026-04-25T11:40:47.466Z","tsv":"'/admin/queues':571,582 '/api':551 '/api/bullmqadapter':558 '/express':565 '/typescript':28 '0':374,391,519 '1':987,1035,1081,1130 '100':300,303 '1000':274,277,357 '123':352,446,456,465,474 '2':992,1040,1089,1137 '24':354,358 '3':269,1001,1049,1098,1145 '4':1009,1056,1105,1153 '5':297,1017,1060,1111,1161 '5000':280 '60':355,356 '60000':302 '9':375,392 '9am':379 'accept':498 'action':341 'ad':793,798 'addit':716 'aggreg':1113 'ai':1066,1074,1082,1086,1115,1182 'ai-workflow-autom':1073,1085,1114,1181 'alert':667,965 'alway':46 'america/new_york':381,394 'antigrav':3 'api':893,991,1036 'app':1176 'app.use':581 'appear':760 'applic':29 'architect':166,949 'architectur':954 'arena':188 'ask':1283 'async':23,290,492,1052,1248 'attempt':268,823 'autom':1076,1088,1117,1184 'avoid':816,848 'await':292,348,365,385,436,501,511,516,708,728 'awesom':4 'back':16 'backend':1032,1039,1059,1125,1164,1173 'background':19,1025,1045,1212 'backoff':67,270,806,814,826,830,1005 'basic':209 'beat':73 'beyond':939 'board':187,527,550,557,564 'boundari':1291 'bull':186,526,549,556,563,1200 'bull-board':185,548,555,562 'bullmq':1,9,11,112,175,190,215,233,253,423,532,592,601,978,999,1007,1030,1047,1054,1071,1096,1103,1123,1135,1143,1151,1195 'bullmq-pro':189 'bullmq-queu':111 'bullmq-specialist':977,998,1006,1029,1046,1053,1070,1095,1102,1122,1134,1142,1150 'bullmqadapt':553,575,578 'capabl':110 'case':56 'category-antigravity-awesome-skills' 'caus':612 'charg':459 'charge-pay':458 'check':585 'child':408 'children':433,447 'clarif':1285 'clear':1258 'close':478,513 'cloud':181 'cluster':902 'collabor':896 'compens':929 'complet':418,435 'complex':399,926 'concurr':86,283,296,870,874,881 'configur':219,780 'connect':239,244,266,295,428,515,587,609,618,892 'conserv':92 'consid':732,797 'console.error':313 'console.log':493 'const':243,261,285,424,490,566 'core':174 'count':276,279 'cqrs':944 'craftsman':160,935 'crash':634,647 'creat':256,603,638,670,1092 'createbullboard':546,572 'criteria':1294 'cron':1138 'current':505 'daili':368,388 'daily-digest':367,387 'dashboard':528,966 'data':94,444,454,463,472,742,749,765 'day':377 'db':891 'dead':75 'default':51,260 'defaultjobopt':267 'defin':1133 'delay':118,194,273,319,331,342,347,353,1224 'delayed-job':117,193 'deleg':897 'deliveri':45,169 'depend':141,398,414,1094 'deploy':486,707,955 'describ':1262 'detect':633 'devop':959,1033,1065 'digest':369,389 'downstream':89,877,885 'drift':864 'driven':953 'dst':849,866 'durat':301 'edg':914 'elasticach':182 'email':168,171,265,289,973,981,988,1010,1015,1179 'email-deliveri':167 'email-system':170,980,1014,1178 'emailqueu':262,576 'enablereadycheck':254 'ensur':884 'environ':1274 'environment-specif':1273 'err':312,318 'error':591 'event':132,162,165,308,623,631,641,655,663,673,942,945,948,952 'event-architect':164,947 'event-driven':951 'event-sourc':161 'everi':376 'execut':24,790,1147 'expert':12,1279 'explicit':48,795,838,855 'exponenti':72,272,813,829 'expressadapt':560,569 'fail':81,310,317,653,662,672,675 'fals':255 'faster':738 'file':697 'finish':508 'fire':34,720,734 'fire-and-forget':33,719,733 'first':419 'flow':137,201,396,1091 'flow-produc':136 'flowproduc':421,425,427 'flowproducer.add':437 'forget':36,722,736 'full':756,770 'futur':336 'grace':102,475,496,683,690,699 'handl':44,107,307,599,629,661,685,701,888,1163 'handler':624,642,656,674,712,725,731 'herd':71,818,834 'high':868,873,883 'home':85 'host':177 'hour':359 'hunter':969,1079,1110,1187 'id':99,316,754,767 'idempot':57 'implement':227 'impli':1194,1199,1205,1211,1217,1223,1229,1235,1241,1247 'import':228,234,420,545,552,559 'indic':645 'infinit':789 'info':714,782,872 'infrastructur':145,900,911,958,962 'inlin':764 'input':1288 'instead':768 'inventori':451,453 'ioredi':176,235,237,246 'issu':619,850 'job':17,31,49,61,82,93,106,115,119,122,124,129,131,140,195,198,200,291,304,311,314,315,322,323,343,361,384,395,403,413,417,482,500,506,543,622,644,654,676,702,744,748,759,777,783,792,803,820,836,843,853,941,993,1090,1132,1146,1213,1218,1225,1231,1242 'job-depend':139 'job-ev':130 'job-flow':199 'job-prior':123 'job-schedul':114 'job.data':294 'keep':773 'kubernet':956 'larg':741,763 'let':41 'letter':76 'limit':87,128,204,284,298,895,997,1250 'linear':74 'load':890,1064 'local':860 'log':679 'long':931,1041 'long-run':930 'lose':481 'low':776 'manag':924,1155 'match':53,1259 'max':299 'maxretriesperrequest':249,589,594,605 'may':62,703 'memori':775,903 'mention':1192,1197,1203,1209,1215,1221,1227,1233,1239,1245 'messag':600,636,668,695,726,758,791,819,851,879 'metric':964 'minut':306 'miss':588,1296 'monitor':184,530,651,665,681,963,972,1107 'multi':401 'multi-step':400 'name':438,448,457,466 'need':83,537,909,921,936,950,961,971 'new':225,245,263,287,426,499,568,574,577 'nextj':1175 'nextjs-app-rout':1174 'node.js':27 'node.js/typescript':26 'notif':471 'notifi':468 'notify-warehous':467 'null':250,595,606 'object':757,771 'option':50,80 'orchestr':157,938 'order':441,443 'orderid':445,455,464,473 'orderqueu':579 'orphan':105,705 'output':1268 'overwhelm':876 'parent':407,429 'parent-child':406 'pass':98,753,766 'pattern':135,192,208,373,390,1139 'payload':101,745 'payment':460,462 'per':305,1063 'perform':968,1078,1106,1109,1186 'performance-hunt':967,1077,1108,1185 'permiss':1289 'pipelin':1068 'potenti':740,867 'prevent':69,104,788,801,832 'principl':30 'prioriti':125 'pro':191 'process':20,404,440,1003,1026,1051,1067,1100,1237,1249 'process-ord':439 'process.env.redis':247 'process.exit':518 'process.on':520,523 'processor':207 'produc':39,138 'product':213 'production-readi':212 'proper':109,218,477,597 'protect':88 'provid':1013 'qstash':154,920 'queu':994,1043 'queue':18,43,77,113,151,210,216,226,229,242,257,264,514,533,540,573,715,908,913,915,922,960,970,974,1201,1207,1219 'queue.add':349,366,709,727 'queue.close':517 'queue.removerepeatable':386 'queue/worker':602 'queueevent':231 'queuenam':442,452,461,470 'railway':183 'rare':52 'rate':127,203,894,996 'rate-limit':202 'rate-limiting-job':126 'readi':214 'receiv':990,1037 'reconnect':598 'redi':15,144,147,180,586,608,617,774,899,901,906,910,917,925,984,1021,1023,1127,1157,1159,1171,1206 'redis-back':14 'redis-cloud':179 'redis-infrastructur':143 'redis-specialist':146,905,983,1022,1126,1158,1170 'relat':1165 'relationship':409 'reliabl':22 'remind':338,350 'remov':382 'removeoncomplet':275 'removeonfail':278 'repeat':121,197,360,372,383,835,842,852,1131,1230 'repeatable-job':120,196 'request':711,724,730,989,1038 'requir':251,593,1287 'respons':60,739 'restart':488 'result':1057,1112,1162 'retri':804,810,822 'review':1280 'router':1177 'run':63,325,344,362,932 'safeti':1290 'saga':928 'sandbox':206 'sandboxed-processor':205 'scale':957,1062 'schedul':116,321,335,364,1118,1149,1243 'scope':142,1261 'sendemail':293 'sensibl':259 'sent':1011 'server':859 'serveradapt':567,580 'serveradapter.getrouter':583 'serveradapter.setbasepath':570 'serverless':150,912 'serverless-queu':149 'servic':90,878,886 'set':47 'setup':211 'sever':590,625,657,686,713,746,781,808,840,871 'share':238 'shut':494,691 'shutdown':103,476,491,522,525,684,700 'sickn33':8 'side':40 'sigint':524 'sigterm':108,521 'sigterm/sigint':694 'simpl':940 'skill':5,6,976,1028,1069,1121,1166,1253 'small':97,752 'sourc':163,943 'source-sickn33' 'specialist':2,10,148,907,979,985,1000,1008,1024,1031,1048,1055,1072,1097,1104,1124,1128,1136,1144,1152,1160,1172 'specif':327,1275 'specifi':845 'stack':975,1027,1120 'stage':1101 'stall':621,630,640,643 'start':91,223 'state':544,1154 'status':541,1018 'step':402 'stop':497,615,1281 'stored/notified':1058 'strategi':68,807,827 'stream':946 'stuck':802 'submit':1084 'substitut':1271 'success':1293 'summari':371 'system':172,982,1016,1180 'task':337,1042,1083,1119,1257 'tempor':159,934 'temporal-craftsman':158,933 'test':1277 'thunder':70,817,833 'time':328,340,861 'timeout':510,779,786,796,799 'timezon':839,846,856,1141 'tool':173 'track':1019 'treat':1266 'trigger':898 'tune':904 'type':271,370 'tz':380,393 'upstash':153,178,919 'upstash-qstash':152,918 'url':248 'use':55,222,334,412,485,536,812,828,858,1190,1251 'user':1191,1196,1202,1208,1214,1220,1226,1232,1238,1244 'userid':351 'valid':450,584,1276 'validate-inventori':449 'via':1012 'visibl':538 'visual':529 'wait':430,503 'warehous':469 'warn':626,658,687,747,809,841 'well':1168 'without':480,604,639,671,698,778,794,805,837,854,923 'work':1167 'worker':134,230,281,286,288,479,489,613,627,635,637,646,659,669,688,696,869,880,1002,1050,1061,1099,1236 'worker-pattern':133 'worker.close':512 'worker.on':309 'worker.pause':502 'workflow':156,927,937,986,1034,1075,1080,1087,1116,1129,1183 'workflow-orchestr':155","prices":[{"id":"fc6be68c-d12b-45e9-b1cf-7a725388d03c","listingId":"f1a3fdb0-587c-4bf5-ac36-aaf80464fb68","amountUsd":"0","unit":"free","nativeCurrency":null,"nativeAmount":null,"chain":null,"payTo":null,"paymentMethod":"skill-free","isPrimary":true,"details":{"org":"sickn33","category":"antigravity-awesome-skills","install_from":"skills.sh"},"createdAt":"2026-04-18T20:34:43.061Z"}],"sources":[{"listingId":"f1a3fdb0-587c-4bf5-ac36-aaf80464fb68","source":"github","sourceId":"sickn33/antigravity-awesome-skills/bullmq-specialist","sourceUrl":"https://github.com/sickn33/antigravity-awesome-skills/tree/main/skills/bullmq-specialist","isPrimary":false,"firstSeenAt":"2026-04-18T21:33:49.716Z","lastSeenAt":"2026-04-25T06:50:45.448Z"},{"listingId":"f1a3fdb0-587c-4bf5-ac36-aaf80464fb68","source":"skills_sh","sourceId":"sickn33/antigravity-awesome-skills/bullmq-specialist","sourceUrl":"https://skills.sh/sickn33/antigravity-awesome-skills/bullmq-specialist","isPrimary":true,"firstSeenAt":"2026-04-18T20:34:43.061Z","lastSeenAt":"2026-04-25T11:40:47.466Z"}],"details":{"listingId":"f1a3fdb0-587c-4bf5-ac36-aaf80464fb68","quickStartSnippet":null,"exampleRequest":null,"exampleResponse":null,"schema":null,"openapiUrl":null,"agentsTxtUrl":null,"citations":[],"useCases":[],"bestFor":[],"notFor":[],"kindDetails":{"org":"sickn33","slug":"bullmq-specialist","source":"skills_sh","category":"antigravity-awesome-skills","skills_sh_url":"https://skills.sh/sickn33/antigravity-awesome-skills/bullmq-specialist"},"updatedAt":"2026-04-25T11:40:47.466Z"}}