From f1cd7afbdd087c20a9fbc7b60e841867e949f4b1 Mon Sep 17 00:00:00 2001 From: tanbirali Date: Mon, 20 Oct 2025 14:41:01 +0530 Subject: [PATCH 1/9] feat: added bull-board/nestjs dependencies --- package-lock.json | 71 ++++++++++++++++++++++++++++++++++++++--------- package.json | 2 ++ 2 files changed, 60 insertions(+), 13 deletions(-) diff --git a/package-lock.json b/package-lock.json index 62913d174..ab9145b86 100644 --- a/package-lock.json +++ b/package-lock.json @@ -21,6 +21,8 @@ "@angular/platform-browser-dynamic": "20.2.4", "@angular/router": "20.2.4", "@angular/service-worker": "20.2.4", + "@bull-board/express": "^6.13.1", + "@bull-board/nestjs": "^6.13.1", "@codewithdan/observable-store": "2.2.15", "@date-fns/utc": "2.1.0", "@dfinity/agent": "0.15.7", @@ -4645,6 +4647,53 @@ "devOptional": true, "license": "(Apache-2.0 AND BSD-3-Clause)" }, + "node_modules/@bull-board/api": { + "version": "6.13.1", + "resolved": "https://registry.npmjs.org/@bull-board/api/-/api-6.13.1.tgz", + "integrity": "sha512-L9Ukfd/gxg8VIUb+vXRcU31yJsAaLLKG2qU/OMXQJ5EoXm2JhWBat+26YgrH/oKIb9zbZsg8xwHyqxa7sHEkVg==", + "license": "MIT", + "dependencies": { + "redis-info": "^3.1.0" + }, + "peerDependencies": { + "@bull-board/ui": "6.13.1" + } + }, + "node_modules/@bull-board/express": { + "version": "6.13.1", + "resolved": "https://registry.npmjs.org/@bull-board/express/-/express-6.13.1.tgz", + "integrity": "sha512-wipvCsdeMdcgWVc77qrs858OjyGo7IAjJxuuWd4q5dvciFmTU1fmfZddWuZ1jDWpq5P7KdcpGxjzF1vnd2GaUw==", + "license": "MIT", + "dependencies": { + "@bull-board/api": "6.13.1", + "@bull-board/ui": "6.13.1", + "ejs": "^3.1.10", + "express": "^4.21.1 || ^5.0.0" + } + }, + "node_modules/@bull-board/nestjs": { + "version": "6.13.1", + "resolved": "https://registry.npmjs.org/@bull-board/nestjs/-/nestjs-6.13.1.tgz", + "integrity": "sha512-8rpadHL8/xijrlJ82lkNEm1QzLiGez2/lrT1vwyS+eKPPYZsxd8sKdmKNV762Qmqv+X4vN0DLMvrq6uJ7Nr1cA==", + "license": "MIT", + "peerDependencies": { + "@bull-board/api": "^6.13.1", + "@nestjs/bull-shared": "^10.0.0 || ^11.0.0", + "@nestjs/common": "^9.0.0 || ^10.0.0 || ^11.0.0", + "@nestjs/core": "^9.0.0 || ^10.0.0 || ^11.0.0", + "reflect-metadata": "^0.1.13 || ^0.2.0", + "rxjs": "^7.8.1" + } + }, + "node_modules/@bull-board/ui": { + "version": "6.13.1", + "resolved": "https://registry.npmjs.org/@bull-board/ui/-/ui-6.13.1.tgz", + "integrity": "sha512-DzPjCFzjEbDukhfSd7nLdTLVKIv5waARQuAXETSRqiKTN4vSA1KNdaJ8p72YwHujKO19yFW1zWjNKrzsa8DCIg==", + "license": "MIT", + "dependencies": { + "@bull-board/api": "6.13.1" + } + }, "node_modules/@chevrotain/cst-dts-gen": { "version": "11.0.3", "resolved": "https://registry.npmjs.org/@chevrotain/cst-dts-gen/-/cst-dts-gen-11.0.3.tgz", @@ -16288,7 +16337,6 @@ "version": "3.2.6", "resolved": "https://registry.npmjs.org/async/-/async-3.2.6.tgz", "integrity": "sha512-htCUDlxyyCLMgaM3xXg0C0LW2xqfuQ6p05pCEIsXuyQ+a1koYKTuBMzRNwmybfLgvJDMd0r1LTn4+E0Ti6C2AA==", - "dev": true, "license": "MIT" }, "node_modules/async-function": { @@ -16699,7 +16747,6 @@ "version": "1.0.2", "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz", "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==", - "dev": true, "license": "MIT" }, "node_modules/base64-arraybuffer": { @@ -17061,7 +17108,6 @@ "version": "1.1.12", "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.12.tgz", "integrity": "sha512-9T9UjW3r0UW5c1Q7GTwllptXwhvYmEzFhzMfZ9H7FQWt+uZePjZPjBP/W1ZEyZ1twGWom5/56TF4lPcqjnDHcg==", - "dev": true, "license": "MIT", "dependencies": { "balanced-match": "^1.0.0", @@ -18362,7 +18408,6 @@ "version": "0.0.1", "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", "integrity": "sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==", - "dev": true, "license": "MIT" }, "node_modules/concat-stream": { @@ -21186,7 +21231,6 @@ "version": "3.1.10", "resolved": "https://registry.npmjs.org/ejs/-/ejs-3.1.10.tgz", "integrity": "sha512-UeJmFfOrAQS8OJWPZ4qtgHyWExa088/MtK5UEyoJGFH67cDEXkZSviOiKRCZ4Xij0zxI3JECgYs3oKx+AizQBA==", - "dev": true, "license": "Apache-2.0", "dependencies": { "jake": "^10.8.5" @@ -22881,7 +22925,6 @@ "version": "1.0.4", "resolved": "https://registry.npmjs.org/filelist/-/filelist-1.0.4.tgz", "integrity": "sha512-w1cEuf3S+DrLCQL7ET6kz+gmlJdbq9J7yXCSjK/OZCPA+qEN1WyF4ZAf0YYJa4/shHJra2t/d/r8SV4Ji+x+8Q==", - "dev": true, "license": "Apache-2.0", "dependencies": { "minimatch": "^5.0.1" @@ -22891,7 +22934,6 @@ "version": "2.0.2", "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.2.tgz", "integrity": "sha512-Jt0vHyM+jmUBqojB7E1NIYadt0vI0Qxjxd2TErW94wDz+E2LAm5vKMXXwg6ZZBTHPuUlDgQHKXvjGBdfcF1ZDQ==", - "dev": true, "license": "MIT", "dependencies": { "balanced-match": "^1.0.0" @@ -22901,7 +22943,6 @@ "version": "5.1.6", "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-5.1.6.tgz", "integrity": "sha512-lKwV/1brpG6mBUFHtb7NUmtABCb2WZZmm2wNiOA5hAb8VdCS4B3dtMWyvcoViccwAW/COERjXLt0zP1zXUN26g==", - "dev": true, "license": "ISC", "dependencies": { "brace-expansion": "^2.0.1" @@ -24199,7 +24240,6 @@ "version": "4.0.0", "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", - "devOptional": true, "license": "MIT", "engines": { "node": ">=8" @@ -25976,7 +26016,6 @@ "version": "10.9.2", "resolved": "https://registry.npmjs.org/jake/-/jake-10.9.2.tgz", "integrity": "sha512-2P4SQ0HrLQ+fw6llpLnOaGAvN2Zu6778SJMrCUwns4fOoG9ayrTiZk3VV8sCPkVZF8ab0zksVpS8FDY5pRCNBA==", - "dev": true, "license": "Apache-2.0", "dependencies": { "async": "^3.2.3", @@ -25995,7 +26034,6 @@ "version": "4.1.2", "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", - "dev": true, "license": "MIT", "dependencies": { "ansi-styles": "^4.1.0", @@ -32379,7 +32417,6 @@ "version": "3.1.2", "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", - "dev": true, "license": "ISC", "dependencies": { "brace-expansion": "^1.1.7" @@ -36257,6 +36294,15 @@ "node": ">=4" } }, + "node_modules/redis-info": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/redis-info/-/redis-info-3.1.0.tgz", + "integrity": "sha512-ER4L9Sh/vm63DkIE0bkSjxluQlioBiBgf5w1UuldaW/3vPcecdljVDisZhmnCMvsxHNiARTTDDHGg9cGwTfrKg==", + "license": "MIT", + "dependencies": { + "lodash": "^4.17.11" + } + }, "node_modules/redis-parser": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/redis-parser/-/redis-parser-3.0.0.tgz", @@ -38965,7 +39011,6 @@ "version": "7.2.0", "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", - "dev": true, "license": "MIT", "dependencies": { "has-flag": "^4.0.0" diff --git a/package.json b/package.json index 512f61b6d..edc08f960 100644 --- a/package.json +++ b/package.json @@ -67,6 +67,8 @@ "@angular/platform-browser-dynamic": "20.2.4", "@angular/router": "20.2.4", "@angular/service-worker": "20.2.4", + "@bull-board/express": "^6.13.1", + "@bull-board/nestjs": "^6.13.1", "@codewithdan/observable-store": "2.2.15", "@date-fns/utc": "2.1.0", "@dfinity/agent": "0.15.7", From b107b606983823a8975b070b23bb07afac0d197e Mon Sep 17 00:00:00 2001 From: tanbirali Date: Mon, 20 Oct 2025 14:48:37 +0530 Subject: [PATCH 2/9] feat: registered bull-board for app.module --- apps/api/src/app/app.module.ts | 11 +++++++++++ 1 file changed, 11 insertions(+) diff --git a/apps/api/src/app/app.module.ts b/apps/api/src/app/app.module.ts index 5ec148558..1318a66e4 100644 --- a/apps/api/src/app/app.module.ts +++ b/apps/api/src/app/app.module.ts @@ -14,6 +14,8 @@ import { SUPPORTED_LANGUAGE_CODES } from '@ghostfolio/common/config'; +import { ExpressAdapter } from '@bull-board/express'; +import { BullBoardModule } from '@bull-board/nestjs'; import { BullModule } from '@nestjs/bull'; import { MiddlewareConsumer, Module, NestModule } from '@nestjs/common'; import { ConfigModule } from '@nestjs/config'; @@ -23,6 +25,7 @@ import { ServeStaticModule } from '@nestjs/serve-static'; import { StatusCodes } from 'http-status-codes'; import { join } from 'node:path'; +import { environment } from '../environments/environment'; import { AccessModule } from './access/access.module'; import { AccountModule } from './account/account.module'; import { AdminModule } from './admin/admin.module'; @@ -76,6 +79,14 @@ import { UserModule } from './user/user.module'; port: parseInt(process.env.REDIS_PORT ?? '6379', 10) } }), + ...(!environment.production + ? [ + BullBoardModule.forRoot({ + route: '/admin/queues', + adapter: ExpressAdapter + }) + ] + : []), CacheModule, ConfigModule.forRoot(), ConfigurationModule, From 7be5a507c9903d20046336c421c038926a534cc0 Mon Sep 17 00:00:00 2001 From: tanbirali Date: Mon, 20 Oct 2025 14:49:24 +0530 Subject: [PATCH 3/9] feat: registered bull-board for data-gathering.module --- .../services/queues/data-gathering/data-gathering.module.ts | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/apps/api/src/services/queues/data-gathering/data-gathering.module.ts b/apps/api/src/services/queues/data-gathering/data-gathering.module.ts index b51823476..3e671e430 100644 --- a/apps/api/src/services/queues/data-gathering/data-gathering.module.ts +++ b/apps/api/src/services/queues/data-gathering/data-gathering.module.ts @@ -9,6 +9,8 @@ import { DataGatheringService } from '@ghostfolio/api/services/queues/data-gathe import { SymbolProfileModule } from '@ghostfolio/api/services/symbol-profile/symbol-profile.module'; import { DATA_GATHERING_QUEUE } from '@ghostfolio/common/config'; +import { BullAdapter } from '@bull-board/api/bullAdapter'; +import { BullBoardModule } from '@bull-board/nestjs'; import { BullModule } from '@nestjs/bull'; import { Module } from '@nestjs/common'; import ms from 'ms'; @@ -24,6 +26,10 @@ import { DataGatheringProcessor } from './data-gathering.processor'; }, name: DATA_GATHERING_QUEUE }), + BullBoardModule.forFeature({ + name: DATA_GATHERING_QUEUE, + adapter: BullAdapter + }), ConfigurationModule, DataEnhancerModule, DataProviderModule, From ce4186845c72e6f979e42c1f3ff104e53c970796 Mon Sep 17 00:00:00 2001 From: tanbirali Date: Mon, 20 Oct 2025 14:50:08 +0530 Subject: [PATCH 4/9] feat: registered bull-board for portfolio-snapshot.module --- .../queues/portfolio-snapshot/portfolio-snapshot.module.ts | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/apps/api/src/services/queues/portfolio-snapshot/portfolio-snapshot.module.ts b/apps/api/src/services/queues/portfolio-snapshot/portfolio-snapshot.module.ts index 958636334..e24092b99 100644 --- a/apps/api/src/services/queues/portfolio-snapshot/portfolio-snapshot.module.ts +++ b/apps/api/src/services/queues/portfolio-snapshot/portfolio-snapshot.module.ts @@ -13,6 +13,8 @@ import { PORTFOLIO_SNAPSHOT_COMPUTATION_QUEUE } from '@ghostfolio/common/config'; +import { BullAdapter } from '@bull-board/api/bullAdapter'; +import { BullBoardModule } from '@bull-board/nestjs'; import { BullModule } from '@nestjs/bull'; import { Module } from '@nestjs/common'; @@ -32,6 +34,10 @@ import { PortfolioSnapshotProcessor } from './portfolio-snapshot.processor'; ) } }), + BullBoardModule.forFeature({ + name: PORTFOLIO_SNAPSHOT_COMPUTATION_QUEUE, + adapter: BullAdapter + }), ConfigurationModule, DataProviderModule, ExchangeRateDataModule, From 297bf1456485d8ea3c35b77ed00426dbc67f890a Mon Sep 17 00:00:00 2001 From: tanbirali Date: Tue, 21 Oct 2025 11:40:26 +0530 Subject: [PATCH 5/9] refactor: added readOnlyMode Config to the bullboards --- .../services/queues/data-gathering/data-gathering.module.ts | 5 ++++- .../queues/portfolio-snapshot/portfolio-snapshot.module.ts | 5 ++++- 2 files changed, 8 insertions(+), 2 deletions(-) diff --git a/apps/api/src/services/queues/data-gathering/data-gathering.module.ts b/apps/api/src/services/queues/data-gathering/data-gathering.module.ts index 3e671e430..b836c817d 100644 --- a/apps/api/src/services/queues/data-gathering/data-gathering.module.ts +++ b/apps/api/src/services/queues/data-gathering/data-gathering.module.ts @@ -28,7 +28,10 @@ import { DataGatheringProcessor } from './data-gathering.processor'; }), BullBoardModule.forFeature({ name: DATA_GATHERING_QUEUE, - adapter: BullAdapter + adapter: BullAdapter, + options: { + readOnlyMode: true + } }), ConfigurationModule, DataEnhancerModule, diff --git a/apps/api/src/services/queues/portfolio-snapshot/portfolio-snapshot.module.ts b/apps/api/src/services/queues/portfolio-snapshot/portfolio-snapshot.module.ts index e24092b99..a47ca0f46 100644 --- a/apps/api/src/services/queues/portfolio-snapshot/portfolio-snapshot.module.ts +++ b/apps/api/src/services/queues/portfolio-snapshot/portfolio-snapshot.module.ts @@ -36,7 +36,10 @@ import { PortfolioSnapshotProcessor } from './portfolio-snapshot.processor'; }), BullBoardModule.forFeature({ name: PORTFOLIO_SNAPSHOT_COMPUTATION_QUEUE, - adapter: BullAdapter + adapter: BullAdapter, + options: { + readOnlyMode: true + } }), ConfigurationModule, DataProviderModule, From 54973d1fde1ccc7da9a2c94a74242f0f38ad2743 Mon Sep 17 00:00:00 2001 From: tanbirali Date: Wed, 22 Oct 2025 12:00:05 +0530 Subject: [PATCH 6/9] moved the BullBoard up --- apps/api/src/app/app.module.ts | 16 ++++++++-------- 1 file changed, 8 insertions(+), 8 deletions(-) diff --git a/apps/api/src/app/app.module.ts b/apps/api/src/app/app.module.ts index 1318a66e4..d206a4077 100644 --- a/apps/api/src/app/app.module.ts +++ b/apps/api/src/app/app.module.ts @@ -71,14 +71,6 @@ import { UserModule } from './user/user.module'; AuthDeviceModule, AuthModule, BenchmarksModule, - BullModule.forRoot({ - redis: { - db: parseInt(process.env.REDIS_DB ?? '0', 10), - host: process.env.REDIS_HOST, - password: process.env.REDIS_PASSWORD, - port: parseInt(process.env.REDIS_PORT ?? '6379', 10) - } - }), ...(!environment.production ? [ BullBoardModule.forRoot({ @@ -87,6 +79,14 @@ import { UserModule } from './user/user.module'; }) ] : []), + BullModule.forRoot({ + redis: { + db: parseInt(process.env.REDIS_DB ?? '0', 10), + host: process.env.REDIS_HOST, + password: process.env.REDIS_PASSWORD, + port: parseInt(process.env.REDIS_PORT ?? '6379', 10) + } + }), CacheModule, ConfigModule.forRoot(), ConfigurationModule, From 81a0bc22c1378674aa92adb61de3d387489b673d Mon Sep 17 00:00:00 2001 From: tanbirali Date: Wed, 22 Oct 2025 12:09:37 +0530 Subject: [PATCH 7/9] pinned the version and reinstalled the packages --- package-lock.json | 4 ++-- package.json | 4 ++-- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/package-lock.json b/package-lock.json index ab9145b86..c6ba8bf64 100644 --- a/package-lock.json +++ b/package-lock.json @@ -21,8 +21,8 @@ "@angular/platform-browser-dynamic": "20.2.4", "@angular/router": "20.2.4", "@angular/service-worker": "20.2.4", - "@bull-board/express": "^6.13.1", - "@bull-board/nestjs": "^6.13.1", + "@bull-board/express": "6.13.1", + "@bull-board/nestjs": "6.13.1", "@codewithdan/observable-store": "2.2.15", "@date-fns/utc": "2.1.0", "@dfinity/agent": "0.15.7", diff --git a/package.json b/package.json index edc08f960..04c90a9c9 100644 --- a/package.json +++ b/package.json @@ -67,8 +67,8 @@ "@angular/platform-browser-dynamic": "20.2.4", "@angular/router": "20.2.4", "@angular/service-worker": "20.2.4", - "@bull-board/express": "^6.13.1", - "@bull-board/nestjs": "^6.13.1", + "@bull-board/express": "6.13.1", + "@bull-board/nestjs": "6.13.1", "@codewithdan/observable-store": "2.2.15", "@date-fns/utc": "2.1.0", "@dfinity/agent": "0.15.7", From f9b778008fe473932502b6e13b0ab7cfdd524e21 Mon Sep 17 00:00:00 2001 From: tanbirali Date: Wed, 22 Oct 2025 12:16:22 +0530 Subject: [PATCH 8/9] moved the BullBoard up as per alphabetical order --- .../queues/data-gathering/data-gathering.module.ts | 14 +++++++------- .../portfolio-snapshot.module.ts | 14 +++++++------- 2 files changed, 14 insertions(+), 14 deletions(-) diff --git a/apps/api/src/services/queues/data-gathering/data-gathering.module.ts b/apps/api/src/services/queues/data-gathering/data-gathering.module.ts index b836c817d..ebf39d6a6 100644 --- a/apps/api/src/services/queues/data-gathering/data-gathering.module.ts +++ b/apps/api/src/services/queues/data-gathering/data-gathering.module.ts @@ -19,13 +19,6 @@ import { DataGatheringProcessor } from './data-gathering.processor'; @Module({ imports: [ - BullModule.registerQueue({ - limiter: { - duration: ms('4 seconds'), - max: 1 - }, - name: DATA_GATHERING_QUEUE - }), BullBoardModule.forFeature({ name: DATA_GATHERING_QUEUE, adapter: BullAdapter, @@ -33,6 +26,13 @@ import { DataGatheringProcessor } from './data-gathering.processor'; readOnlyMode: true } }), + BullModule.registerQueue({ + limiter: { + duration: ms('4 seconds'), + max: 1 + }, + name: DATA_GATHERING_QUEUE + }), ConfigurationModule, DataEnhancerModule, DataProviderModule, diff --git a/apps/api/src/services/queues/portfolio-snapshot/portfolio-snapshot.module.ts b/apps/api/src/services/queues/portfolio-snapshot/portfolio-snapshot.module.ts index a47ca0f46..4628d7214 100644 --- a/apps/api/src/services/queues/portfolio-snapshot/portfolio-snapshot.module.ts +++ b/apps/api/src/services/queues/portfolio-snapshot/portfolio-snapshot.module.ts @@ -24,6 +24,13 @@ import { PortfolioSnapshotProcessor } from './portfolio-snapshot.processor'; exports: [BullModule, PortfolioSnapshotService], imports: [ AccountBalanceModule, + BullBoardModule.forFeature({ + name: PORTFOLIO_SNAPSHOT_COMPUTATION_QUEUE, + adapter: BullAdapter, + options: { + readOnlyMode: true + } + }), BullModule.registerQueue({ name: PORTFOLIO_SNAPSHOT_COMPUTATION_QUEUE, settings: { @@ -34,13 +41,6 @@ import { PortfolioSnapshotProcessor } from './portfolio-snapshot.processor'; ) } }), - BullBoardModule.forFeature({ - name: PORTFOLIO_SNAPSHOT_COMPUTATION_QUEUE, - adapter: BullAdapter, - options: { - readOnlyMode: true - } - }), ConfigurationModule, DataProviderModule, ExchangeRateDataModule, From aa1c86a307bb700d6025a84945df50adaa996c09 Mon Sep 17 00:00:00 2001 From: tanbirali Date: Sun, 26 Oct 2025 16:28:01 +0530 Subject: [PATCH 9/9] added an entry in the changelog for my fixes --- CHANGELOG.md | 1 + 1 file changed, 1 insertion(+) diff --git a/CHANGELOG.md b/CHANGELOG.md index 1024336b3..57e2a8afe 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -11,6 +11,7 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0 - Added a close holding button to the holding detail dialog - Extended the user detail dialog in the users section of the admin control panel +- Added bullboard for queue monitoring in the development environment ### Changed