@muleta-dev/server
v0.2.0
Published
Embed the muleta BullMQ dashboard in your Node app — Hono-based handler with framework adapters, ships with the SPA bundled.
Maintainers
Readme
@muleta-dev/server
Embed the muleta dashboard in your Node app. Hono-based HTTP handler with the SPA bundled inside the package — single install, single mount point.
Install
npm install @muleta-dev/server hono zod bullmq ioredishono and zod are peer dependencies; bullmq and ioredis come via @muleta-dev/core. Node 22+ required.
Mount it
Hono (canonical)
import { serve } from "@hono/node-server"
import { createMuleta } from "@muleta-dev/core"
import { createEndpoints, createHandler } from "@muleta-dev/server"
import { Hono } from "hono"
const muleta = await createMuleta({ redis: { url: process.env.REDIS_URL! } })
const dashboard = createHandler({
endpoints: createEndpoints(muleta),
assets: "bundled",
basePath: "/admin/queues",
})
const app = new Hono()
app.route("/admin/queues", dashboard)
serve({ fetch: app.fetch, port: 3000 })basePath matches the URL prefix you mount at — required when mounting under any sub-path. Same bundle works at /admin/queues, on a dedicated subdomain, or anywhere else without a per-mount rebuild.
Other frameworks
Adapters ship as subpath imports:
| Framework | Adapter | Example |
| --- | --- | --- |
| Express | @muleta-dev/server/express (honoToExpress) | examples/embed-express |
| AdonisJS / NestJS / node:http / h3 | @muleta-dev/server/node (honoToNode) | examples/embed-node-http |
Full embed guide with framework-by-framework snippets: https://github.com/DipandaAser/muleta/blob/main/docs/embed.md.
Auth
muleta has no built-in authentication. The dashboard exposes destructive actions (retry, remove, pause). Wrap the mount with your own admin auth middleware before deploying:
app.use("/admin/queues/*", yourAuthMiddleware)
app.route("/admin/queues", dashboard)Patterns for Hono / Express / Adonis: https://github.com/DipandaAser/muleta/blob/main/docs/auth.md.
Status
Pre-1.0. API can change between 0.x minor releases — see CHANGELOG.
