Contributing
PortQueue is free and open source, and contributions are welcome.
Dev setup
It's an npm-workspaces monorepo:
git clone https://github.com/episclera/portqueue
cd portqueue
./scripts/dev/setup.sh # or: npm run setup
setup.sh selects the pinned Node version and installs all workspaces — that's all you
need to get the repo ready. Then:
npm run build # build every package
npm test # test suite (PGLite + SQLite — no external services needed)
npm run lint # ESLint + `tsc --noEmit` in one step
Commits follow Conventional Commits (enforced
by commitlint) — the changelog and the version are derived from them. Releases are cut by a small
script in CI (scripts/ci_cd/release-commit.mjs): every push to main is a release, with no release
PR to merge and no git tags. It publishes @portqueue/core, @portqueue/dashboard and
@portqueue/cli together at one shared version and records it in the
changelog. Every commit type is
releasable: feat: ships a minor, ! (or a BREAKING CHANGE: footer) a major, and anything else
(fix:, refactor:, docs:, …) a patch — so reserve ! for real breaks of the public API.
Automated tests run on PGLite + SQLite only, so they need no external DB server. Both are in-process, so the whole suite — the conformance kit included — runs anywhere; and because PGLite is PostgreSQL compiled to WASM, the PostgreSQL SQL is exercised by inheritance too.
MySQL and Oracle are verified by hand. Their SQL is authored in their own dialects and no in-process engine can exercise it, so a change to either driver isn't finished until you've run the conformance kit against a real server:
import { runConformance } from '@portqueue/core/conformance';
import { MysqlDriver } from '@portqueue/core/drivers/mysql';
runConformance({
name: 'mysql',
createDriver: () => new MysqlDriver({ connectionString: process.env.DATABASE_URL }),
});
Start one in Docker. Each engine has an npm run script and an equivalent shell script under
scripts/dev/db/ — use whichever you prefer:
npm run db:postgresql:up # or: ./scripts/dev/db/start-postgresql.sh (stop: db:postgresql:down)
npm run db:mysql:up # or: ./scripts/dev/db/start-mysql.sh (stop: db:mysql:down)
npm run db:oracle:up # or: ./scripts/dev/db/start-oracle.sh (stop: db:oracle:down)
There are also runnable example apps under examples/ (dashboard servers,
job scheduling) — a quick way to exercise the library locally. See the
Examples page for how to run each one.
Packages:
packages/core→@portqueue/core— the library + bundled first-party drivers.packages/dashboard→@portqueue/dashboard— the pluggable React dashboard.packages/cli→@portqueue/cli— the command-line tool.packages/ui→@portqueue/ui— shared theme/components (private, never published).docs/→ this Docusaurus site.
Conventions
- Named options everywhere — any method with more than one input takes one options object.
- Enums, not magic strings — for states, events, step keys, capabilities, error codes.
- Strict types, no
any— payload types flow through generics. - Small, focused classes; explain the "why" in docs when a non-obvious choice is made.
Filing issues & PRs
- Open issues and PRs on GitHub. Include a minimal repro for bugs.
- New behavior needs tests; a driver contribution should pass the conformance kit — against a real server for MySQL and Oracle, and say so in the PR.
- Be kind — a standard code of conduct applies.
Meet the people behind it on the Team page.
Working on the UI
When implementing anything user-facing — the dashboard, docs, or shared @portqueue/ui
components — consult the Brandbook first. It's the source of truth for the
palette, typography, iconography, tone, and component style, so contributions stay visually
consistent. Icons come from @portqueue/ui's curated src/icons.ts re-export of
@ant-design/icons — never emoji, and never a direct import of the icon package.