QQueue Project Status
Current capability and gap audit.
Summary
QQueue is a self-hosted beta ready for early technical users and undergoing launch preparation. The repository contains an implemented TypeScript monorepo with an Express API, React dashboard, BullMQ worker processes, Prisma/PostgreSQL data model, Redis queues, SMTP sending, tracking, transactional API keys, outbound webhooks, an MIT-licensed SDK package, tests, deployment files, and open-core licensing guardrails.
Following the Beta Polish + Launch Prep Sprint, QQueue now includes:
- Authentication
- Organizations
- SMTP connections
- Contacts
- Contact lists
- Templates
- Campaigns
- Transactional API
- API keys
- Tracking
- Webhooks
- Queue workers
- Queue operations dashboard
- Password reset
- Rate limiting
- SDK
- Mailcow documentation
- Docker smoke tests
- Licensing and legal structure
With the core product surfaces implemented and the launch-prep gaps closed, the focus is shifting away from feature development toward:
- documentation
- onboarding
- launch preparation
- real-world testing
- user feedback
The remaining open items are primarily commercial/cloud features, multi-user organization management, and qualified legal review — none of which block an early self-hosted beta.
Beta Readiness Assessment
Status: Self-Hosted Beta for Early Technical Users
Completed:
- Authentication
- Organizations
- SMTP Connections
- Contacts
- Contact Lists
- Templates
- Campaigns
- Transactional API
- API Keys
- Tracking
- Webhooks
- Queue Workers
- Queue Operations Dashboard
- Password Reset
- Rate Limiting
- SDK
- Mailcow Documentation
- Docker Smoke Tests
- Licensing and Legal Structure
Assessment: The platform is suitable for early self-hosted beta users and real-world validation. All core self-hosted flows are implemented, the full verification suite (including a Docker-backed end-to-end smoke test) passes, and operational and abuse-control gaps from the original audit have been closed.
Repository Structure
apps/api: Express API. It owns HTTP routing, auth/session tokens, password reset, organization access checks, Prisma access, product modules, transactional sends, tracking endpoints, inbound ESP webhook normalization, queue operations endpoints, Redis-backed rate limiting, and queue enqueueing.apps/web: Vite React dashboard. It includes login/register, password reset, dashboard, one-off send, SMTP connections, contacts, contact lists, templates, campaigns, campaign analytics, queue operations, settings/API keys/webhooks, and legal pages.apps/worker: BullMQ workers. It processes campaign fan-out jobs, email sending jobs, outbound webhook delivery jobs, and startup recovery for queued work.apps/cloud: proprietary managed-cloud boundary scaffold. It currently contains package metadata, README, and a commercial license draft, but no production cloud behavior.packages/shared: shared TypeScript domain types and Zod schemas for auth, organizations, contacts, lists, templates, campaigns, transactional sends, API keys, webhooks, SMTP connections, cron validation, and timezones.packages/email-engine: email provider abstraction, Nodemailer-backed SMTP provider, tracking URL/token helpers, and explicit placeholder provider classes for Mailcow/SES/Resend/Brevo/Postmark.packages/sdk: MIT-licensed TypeScript SDK package. It currently wraps the public transactional email send endpoint.apps/api/prisma: PostgreSQL schema and migrations for users, organizations, SMTP connections, contacts, contact lists, templates, campaigns, campaign runs, email jobs, email events, API keys, webhook endpoints, webhook deliveries, and password reset tokens.scripts: coverage badge generation, dependency license audit, cloud boundary guardrail checks, and the Docker-backed smoke test (docker-smoke.ts)..github/workflows: coverage, Phase 7 guardrails, and SDK publish workflows.- Deployment files:
docker-compose.ymlfor local Postgres/Redis,docker-compose.prod.ymlfor Caddy/API/worker/Postgres/Redis/migrations,docker-compose.smoke.ymlfor the throwaway smoke-test stack, app Dockerfiles, andCaddyfile.
Completed So Far
Project Setup
- pnpm workspace and Turborepo root.
- TypeScript base config plus per-package configs.
- ESLint and Prettier configuration.
- Local Docker Compose for PostgreSQL and Redis.
- Root scripts for dev, build, lint, typecheck, test, coverage, Prisma, license audit, cloud boundary checks, and Docker smoke test.
-
.env.examplewith local and production-oriented settings.
Licensing and Legal
- Root AGPL-3.0 core license.
- Proprietary
apps/cloudcommercial license draft. - MIT SDK license and package metadata.
-
NOTICE.mdandTRADEMARK.md. - Licensing overview docs.
- Draft cloud Terms of Service and Privacy Policy under
docs/legal. - Signed-off-by/CLA guardrail workflow for pull requests.
- [~] Legal posture documented but marked as needing qualified legal review.
- Lawyer review for commercial license, CLA, Terms, Privacy Policy, and dependency license output.
Core Platform
- Express app setup with CORS, JSON body parsing, request logging, health route, v1 router, and error handling.
- Module structure with route/controller/service separation.
- Prisma client integration.
- PostgreSQL schema and migrations.
- Organization membership helper and role checks.
- Redis-backed rate limiting on auth and public sending paths.
Auth
- Register creates a user and first organization.
- Login returns user organizations and auth tokens.
- Refresh token endpoint exists.
- Password hashing and JWT token helpers are tested.
- Auth middleware protects dashboard routes.
- Password reset flow (request, token, confirm).
- Password reset email delivery (sent via the organization's SMTP connection).
- Password reset token invalidation.
- [~] Still lacks email verification, MFA, and session/device management.
Security
- Redis-backed rate limiting covering:
- register
- login
- refresh token
- password reset requests
- transactional send endpoint
- Encrypted SMTP credentials at rest.
- HMAC-signed tracking tokens and signed outbound webhook deliveries.
Operations
- Queue operations dashboard (web page).
- Queue summaries (queued, processing, failed counts).
- Failed job visibility with attempt counts and failure reasons.
- Retry failed jobs.
- Queue monitoring API.
- Queue operations access restricted to OWNER/ADMIN roles.
Documentation
- Mailcow setup guide.
- Quickstart guide.
- Troubleshooting guide.
- Beta checklist.
- Demo walkthrough.
- Architecture, roadmap, deployment, decisions, cloud boundary, transactional API, licensing, dependency license, contributing, and SDK docs.
Organizations
- Organization model and membership model exist.
- Organization CRUD routes/services exist.
- Access and role helpers exist.
- [~] Organization members beyond initial owner are modeled but no invitation or member-management UI/workflow exists yet.
SMTP Connections
- SMTP connection CRUD exists.
- Credentials are encrypted before storage.
- Create/update verifies SMTP connectivity with Nodemailer.
- Default SMTP connection selection is implemented.
- Dashboard page exists.
- Dedicated Mailcow setup documentation.
Contacts, Templates, and Campaigns
- Contacts CRUD exists.
- Contact lists CRUD and contact membership exist.
- Templates CRUD exists.
- Campaign drafts, duplicate, delete, send now, one-shot schedule, recurrence, pause, resume, and analytics exist.
- Dashboard pages exist for contacts, contact lists, templates, campaigns, and analytics.
- [~] Template variables are simple string replacement.
Queues and Workers
- Redis/BullMQ queue definitions exist for email sending, campaign processing, and webhook delivery.
- API enqueues sends/campaigns/webhook deliveries.
- Worker sends email through SMTP and records events.
- Campaign worker expands active contacts into queued email jobs.
- Webhook worker delivers signed outbound webhooks.
- Worker startup recovers queued email jobs, scheduled campaigns, recurring campaigns, and pending/failed webhook deliveries.
- Queue operations dashboard and API for queue summaries, failed jobs, and retries.
Transactional API
- API key model, creation, listing, revocation, hashing, and auth exist.
- Public transactional send endpoint accepts API keys.
- Dashboard JWT flow can also use transactional send with organization ID.
- Direct content and template-based sends exist.
- Delayed sends with
scheduledAtexist. - Stable
{ id, status }response and machine-readable error codes exist. - Transactional API docs and SDK examples exist.
- Redis-backed rate limiting on the send endpoint.
- [~] Idempotency keys and usage tracking are not yet implemented.
Tracking and Webhooks
- Open tracking pixel and click redirect endpoints exist.
- HMAC-signed tracking tokens exist.
- Tracking injection rewrites absolute links and appends a pixel.
- Inbound normalized ESP webhook endpoint exists for delivered, bounced, and complained events.
- Outbound webhook endpoints, signed deliveries, delivery history, and manual retry exist.
- [~] Provider-specific inbound webhook adapters are not implemented; docs describe mapping provider payloads through a relay/function.
SDK
-
qqueue-sdkpackage exists with MIT license. -
QQueueClient.sendEmailwraps the transactional send endpoint. - SDK error class exposes HTTP status and optional error code.
- README, changelog, release checklist, npm publish workflow, and package tarball are present.
- [~] SDK scope is narrow: no clients for templates, contacts, campaigns, webhooks, or API keys.
Admin / Dashboard
- Dashboard shell and session context exist.
- Operational pages exist for the main self-hosted flows.
- Queue operations page for OWNER/ADMIN members.
- Settings page includes organization creation, API keys, and webhook endpoint/delivery management.
- [~] Admin capabilities are product-level but not full hosted-operations admin: no billing dashboard, tenant ops dashboard, deliverability admin, or abuse review tools.
Cloud / Proprietary Setup
-
apps/cloudfenced package exists. - Cloud README and license boundary docs exist.
- Script prevents core packages from depending on
@qqueue/cloud. - CI runs cloud boundary checks.
- Billing, usage metering, hosted onboarding, managed sending infrastructure, cloud admin dashboards, and tenant operations are not started.
Tests
- Vitest configs exist for API, web, worker, shared, email-engine, and SDK.
- API service/middleware/lib/app tests exist.
- Worker lib/worker tests exist.
- Web component/page/lib/route tests exist.
- Shared, email-engine, and SDK tests exist.
- Queues are stubbed in API tests, eliminating Redis noise from the suite.
- Docker-backed integration smoke test (
pnpm test:smoke:docker). - End-to-end smoke test: register → SMTP → transactional send → worker processing.
- Coverage thresholds are documented in the README.
CI / Scripts
- Coverage workflow runs install, Prisma generate, coverage tests, badge
generation, and badge commit on
main. - Phase 7 guardrail workflow runs cloud boundary, dependency license audit, and Signed-off-by checks.
- SDK publish workflow verifies tag/version alignment and runs SDK checks before npm publish.
- Coverage badge generation script exists.
- Dependency license audit script exists.
- Cloud boundary script exists.
- Docker smoke-test script (
scripts/docker-smoke.ts) exists.
Current Capabilities
End-to-end, the app can currently support a self-hosted operator who:
- Starts PostgreSQL and Redis locally or runs the production Docker Compose stack behind Caddy.
- Registers a user and creates the first organization.
- Logs into the React dashboard.
- Recovers an account through the password reset flow.
- Creates and verifies an SMTP connection.
- Creates contacts, contact lists, and templates.
- Sends a one-off transactional email from the dashboard or API key.
- Creates campaigns, sends now, schedules one-shot campaigns, configures recurring campaigns, pauses/resumes campaigns, and views campaign analytics.
- Records queued, sent, delivered, opened, clicked, bounced, complained, and failed events where the matching flow emits them.
- Monitors queues, inspects failed jobs, and retries them from the queue operations dashboard (OWNER/ADMIN only).
- Creates outbound webhook endpoints, receives signed webhook deliveries, views recent attempts, and manually retries failed deliveries.
- Uses the SDK to call the transactional send API.
Known Gaps
Product
- Organization invitation flow
- Member management UI
- Usage metrics dashboard
- Transactional send idempotency keys
- Provider-specific inbound webhook adapters
- Expanded SDK functionality beyond
sendEmail
UX
- Hide Queue Operations navigation for non-admin members
- Improve password reset experience when no SMTP connection exists
Cloud / Commercial
- Billing
- Plans and subscriptions
- Usage quotas
- Hosted onboarding
- Managed infrastructure
- Deliverability tooling
- Cloud admin dashboards
Legal
- Lawyer review of commercial license
- Lawyer review of Terms of Service
- Lawyer review of Privacy Policy
- Review dependency license audit output
Public Beta Checklist
- Mailcow guide.
- Password reset.
- Rate limiting for auth and public transactional send endpoints.
- Queue operations dashboard for failed/queued/retry state.
- Docker-backed integration smoke test (API + Postgres + Redis + worker).
- Legal docs draft (Terms, Privacy Policy, licenses, trademark notice).
- Verification suite passing (
lint,typecheck,build,test,test:smoke:docker,license:audit,cloud:boundary). - Verify production Docker Compose from a clean checkout on a fresh host.
- Review legal docs, CLA, commercial license, trademark notice, and dependency license output with qualified counsel before commercial use.
Recommended Next Sprint
- Create landing page at qqueue.app.
- Record demo video using the Demo walkthrough.
- Open-source public release preparation.
- Gather first beta users.
- Add organization invitations.
- Add member management.
- Add usage metrics dashboard.
- Expand SDK functionality.
- Improve onboarding UX.
- Collect feedback from real installations.
Verification
Verified with the following commands on 2026-06-11:
-
pnpm lintpassed. -
pnpm typecheckpassed. -
pnpm buildpassed. -
pnpm testpassed: 62 test files and 536 tests passed across API, web, worker, shared, email-engine, and SDK packages. -
pnpm test:smoke:dockerpassed: a throwaway Postgres + Redis stack ran the full register → SMTP connection → transactional send → worker processing flow and confirmed the job reachedSENT. -
pnpm license:auditpassed. The audit reported reviewed license tokens including MIT, Apache-2.0, BSD-2-Clause, BSD-3-Clause, ISC, MPL-2.0, CC-BY-4.0, BlueOak-1.0.0, MIT-0, and Python-2.0. -
pnpm cloud:boundarypassed.
Notes:
- Password reset emails are now delivered through the organization's SMTP connection (preferring the default connection) rather than a separate system mailer.
- Queue operations are restricted to OWNER/ADMIN roles via
requireOrgRole. - Redis noise in the API test suite has been eliminated through global queue
stubbing in
apps/api/src/test/setup.ts. - No production credentials or destructive commands were used.