{"_id":"@ctberger/agendash-v5","name":"@ctberger/agendash-v5","dist-tags":{"latest":"5.0.0"},"versions":{"5.0.0":{"name":"@ctberger/agendash-v5","version":"5.0.0","description":"A modern dashboard for Agenda.js with Express v5 support, Pagination and Search capabilities","main":"app.js","bin":{"agendash-v5":"bin/agendash-standalone.js"},"engines":{"node":">=18.0.0"},"scripts":{"test":"run-p lint ava","lint":"eslint ./","ava":"ava -v -c 1"},"keywords":["agenda","agendash","dashboard","job-queues","express5","express-v5","agenda-dashboard"],"repository":{"type":"git","url":"git+https://github.com/ctberger/agendash.git"},"bugs":{"url":"https://github.com/ctberger/agendash/issues"},"homepage":"https://github.com/ctberger/agendash#readme","license":"MIT","dependencies":{"agenda":"^4.2.1","commander":"^2.9.0","express":"^5.1.0","mongodb":"*","semver":"^7.3.4"},"devDependencies":{"@fastify/static":"^6.5.0","@hapi/hapi":"^20.2.1","@hapi/inert":"^6.0.5","ava":"3.15.0","eslint":"7.19.0","fastify":"^4.9.2","koa":"2.13.1","koa-bodyparser":"4.3.0","koa-router":"10.0.0","koa-static":"5.0.0","npm-run-all":"4.1.5","prettier":"2.2.1","supertest":"^6.2.2"},"eslintConfig":{"parserOptions":{"ecmaVersion":2019},"env":{"es6":true,"node":true},"extends":"eslint:recommended"},"eslintIgnore":["public"],"_id":"@ctberger/agendash-v5@5.0.0","gitHead":"e86e7f7d3e411c1d61f2975dd2876a17b7205b38","_nodeVersion":"22.19.0","_npmVersion":"10.9.3","dist":{"integrity":"sha512-xJ21+Hbvnu4EnSMEfGneM1LONzLm5Un9obC0e3QFrHparJxfqQx99YjRkG8yRrRhUuq+dF/MlzesfuaoBC8n7A==","shasum":"d8e01187fa6b88558f98a0b52ddb418abf2d88d9","tarball":"https://registry.npmjs.org/@ctberger/agendash-v5/-/agendash-v5-5.0.0.tgz","fileCount":43,"unpackedSize":579822,"signatures":[{"keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U","sig":"MEYCIQCGcPTEPUdi0S2XKpfkRie/ks3ljUslPbACP3XZTMm4jAIhAO1SjvnXmJz9bmcbO2gfkLn5Zcgv9F9kOxQ1/Od7WwBV"}]},"_npmUser":{"name":"ctberger","email":"chrisb000@gmail.com"},"directories":{},"maintainers":[{"name":"ctberger","email":"chrisb000@gmail.com"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages-npm-production","tmp":"tmp/agendash-v5_5.0.0_1757990546859_0.249018712603152"},"_hasShrinkwrap":false}},"time":{"created":"2025-09-16T02:42:26.802Z","5.0.0":"2025-09-16T02:42:27.143Z","modified":"2025-09-16T02:42:27.401Z"},"maintainers":[{"name":"ctberger","email":"chrisb000@gmail.com"}],"description":"A modern dashboard for Agenda.js with Express v5 support, Pagination and Search capabilities","homepage":"https://github.com/ctberger/agendash#readme","keywords":["agenda","agendash","dashboard","job-queues","express5","express-v5","agenda-dashboard"],"repository":{"type":"git","url":"git+https://github.com/ctberger/agendash.git"},"bugs":{"url":"https://github.com/ctberger/agendash/issues"},"license":"MIT","readme":"# Agendash (Express v5)\r\n\r\nA Dashboard for [Agenda](https://github.com/agenda/agenda) with **Express v5 support**.\r\n\r\n> **Note**: This is a fork of the original [agendash](https://github.com/agenda/agendash) with migration to Express v5 and Node.js 18+.\r\n\r\n---\r\n\r\n### Features\r\n\r\n- Job status auto-refreshes: 60-second polling by default.\r\n- Schedule a new job from the UI.\r\n- Dive in to see more details about the job, like the json data.\r\n- Requeue a job. Clone the data and run immediately.\r\n- Delete jobs. Useful for cleaning up old completed jobs.\r\n- Search jobs by name and metadata. Supports querying by Mongo Object Id.\r\n- Pagination\r\n- Responsive UI\r\n\r\n---\r\n\r\n### Screenshots\r\n\r\n#### Dashboard\r\n\r\n![Auto-refresh list of jobs](all-jobs.png)\r\n\r\n---\r\n\r\n#### Create jobs\r\n\r\n![See job details, requeue or delete jobs](create-job.png)\r\n\r\n---\r\n\r\n#### Search by name, metadata, job status\r\n\r\n![Search for a job by name or metadata ](search.png)\r\n\r\n---\r\n\r\n#### Responsive UI\r\n\r\n![Mobile UI small devices](mobile-ui-sm.png)\r\n\r\n![Mobile UI extra small devices](mobile-ui-xs.png)\r\n\r\n---\r\n\r\n# Troubleshooting\r\n\r\n### Index for sorting\r\n\r\nIt may be required to create the following index for faster sorting (see [#24](https://github.com/agenda/agendash/issues/24))\r\n\r\n```\r\ndb.agendaJobs.ensureIndex({\r\n    \"nextRunAt\" : -1,\r\n    \"lastRunAt\" : -1,\r\n    \"lastFinishedAt\" : -1\r\n}, \"agendash\")\r\n```\r\n\r\n---\r\n\r\n# Roadmap\r\n\r\n- [ ] Get more test coverage\r\n- [ ] Add middlewares for fastify, and other express-like libraries\r\n- [ ] You decide! Submit a feature request\r\n\r\n### Install\r\n\r\n```\r\nnpm install --save agendash\r\n```\r\n\r\n_Note_: `Agendash` requires mongodb version >2.6.0 to perform the needed aggregate queries. This is your mongo database version, not your node package version! To check your database version, connect to mongo and run `db.version()`.\r\n\r\n### Middleware usage\r\n\r\n#### Express\r\n\r\nAgendash provides Express middleware you can use at a specified path, for example this will\r\nmake Agendash available on your site at the `/dash` path. Note: Do not try to mount Agendash\r\nat the root level like `app.use('/', Agendash(agenda))`.\r\n\r\n```js\r\nvar express = require(\"express\");\r\nvar app = express();\r\n\r\n// ... your other express middleware like body-parser\r\n\r\nvar Agenda = require(\"agenda\");\r\nvar Agendash = require(\"agendash\");\r\n\r\nvar agenda = new Agenda({ db: { address: \"mongodb://127.0.0.1/agendaDb\" } });\r\n// or provide your own mongo client:\r\n// var agenda = new Agenda({mongo: myMongoClient})\r\n\r\napp.use(\"/dash\", Agendash(agenda));\r\n\r\n// ... your other routes\r\n\r\n// ... start your server\r\n```\r\n\r\nBy mounting Agendash as middleware on a specific path, you may provide your\r\nown authentication for that path. For example if you have an authenticated\r\nsession using passport, you can protect the dashboard path like this:\r\n\r\n```js\r\napp.use(\r\n  \"/dash\",\r\n  function (req, res, next) {\r\n    if (!req.user || !req.user.is_admin) {\r\n      res.send(401);\r\n    } else {\r\n      next();\r\n    }\r\n  },\r\n  Agendash(agenda)\r\n);\r\n```\r\n\r\nOther middlewares will come soon in the folder `/lib/middlewares/`.\r\nYou'll just have to update the last line to require the middleware you need:\r\n\r\n```js\r\napp.use(\r\n  \"/agendash\",\r\n  Agendash(agenda, {\r\n    middleware: \"connect\",\r\n  })\r\n);\r\n```\r\n\r\nNote that if you use a CSRF protection middleware like [`csurf`](https://www.npmjs.com/package/csurf), you might need to [configure it off](https://github.com/agenda/agendash/issues/23#issuecomment-270917949) for Agendash-routes.\r\n\r\n#### Hapi\r\n\r\nA minimum Node.js version 12 is required for `@hapi/hapi` dependency.\r\n\r\n```shell\r\nnpm i @hapi/inert @hapi/hapi\r\n```\r\n\r\n```js\r\nconst agenda = new Agenda().database(\r\n  \"mongodb://127.0.0.1/agendaDb\",\r\n  \"agendaJobs\"\r\n);\r\n\r\nconst server = require(\"@hapi/hapi\").server({\r\n  port: 3002,\r\n  host: \"localhost\",\r\n});\r\nawait server.register(require(\"@hapi/inert\"));\r\nawait server.register(\r\n  Agendash(agenda, {\r\n    middleware: \"hapi\",\r\n  })\r\n);\r\n\r\nawait server.start();\r\n```\r\n\r\nThen browse to `http://localhost:3002/`.\r\n\r\n#### Koa\r\n\r\n```shell\r\nnpm i koa koa-bodyparser koa-router koa-static\r\n```\r\n\r\n```js\r\nconst agenda = new Agenda().database(\r\n  \"mongodb://127.0.0.1/agendaDb\",\r\n  \"agendaJobs\"\r\n);\r\n\r\nconst Koa = require(\"koa\");\r\nconst app = new Koa();\r\nconst middlewares = Agendash(agenda, {\r\n  middleware: \"koa\",\r\n});\r\nfor (const middleware of middlewares) {\r\n  app.use(middleware);\r\n}\r\n\r\nawait app.listen(3002);\r\n```\r\n\r\nThen browse to `http://localhost:3002/`.\r\n\r\n#### Fastify\r\n\r\n```shell\r\nnpm i fastify\r\n```\r\n\r\n```js\r\nconst agenda = new Agenda().database(\r\n  \"mongodb://127.0.0.1/agendaDb\",\r\n  \"agendaJobs\"\r\n);\r\n\r\nconst Fastify = require(\"fastify\");\r\nconst fastify = new Fastify();\r\n\r\nfastify.register(\r\n  Agendash(\r\n    agenda, \r\n    { middleware: \"fastify\" }\r\n  );\r\n);\r\n\r\nawait fastify.listen(3002);\r\n```\r\n\r\nThen browse to `http://localhost:3002/`.\r\n\r\n### Standalone usage\r\n\r\nAgendash comes with a standalone Express app which you can use like this:\r\n\r\n```bash\r\n./node_modules/.bin/agendash --db=mongodb://localhost/agendaDb --collection=agendaCollection --port=3002\r\n```\r\n\r\nor like this, for default collection `agendaJobs` and default port `3000`:\r\n\r\n```bash\r\n./node_modules/.bin/agendash --db=mongodb://localhost/agendaDb\r\n```\r\n\r\nIf you are using npm >= 5.2, then you can use [npx](https://medium.com/@maybekatz/introducing-npx-an-npm-package-runner-55f7d4bd282b):\r\n\r\n```bash\r\nnpx agendash --db=mongodb://localhost/agendaDb --collection=agendaCollection --port=3002\r\n```\r\n\r\nThen browse to `http://localhost:3002/`.\r\n\r\n### Docker usage\r\n\r\nAgendash can also be run within a Docker container like this:\r\n\r\n```bash\r\ndocker run -p 3000:3000 \\\r\n  --env MONGODB_URI=mongo://myUser:myPass@myHost/myDb \\\r\n  --env COLLECTION=myAgendaCollection agenda/agendash\r\n```\r\n\r\nThen browse to `http://localhost:3000/`.\r\n","readmeFilename":"README.md","_rev":"1-c69bbbbaef99b8a245ab460b8f1a77d2"}