Product roadmap
Carried over from QwixPBX v1’s ROADMAP.md (27 areas), re-marked against what this codebase
actually contains. v1’s own status markers were unreliable — it marked Billing, FAX and
SMS/Messaging as complete when they had schema and no working feature — so every line below was
checked against the code rather than copied.
For what blocks a shippable product, see mvp.md — this file is the long view.
Re-checked against the code on 2026-08-01.
Status key
| Mark | Meaning |
|---|---|
| Working | Built, deployed, and proven by doing it — a call placed, a packet captured |
| Untested | Code exists and is deployed; it has never been executed |
| Partial | Real but incomplete — the gap is named |
| Schema only | A table exists; nothing reads or writes it as a feature |
| Not started | Design may exist under docs/design/; no code |
The distinction between Working and Untested is the one that matters. Four bugs found on 2026-07-31 were all code that read as correct and did nothing, and static review caught none of them. “Deployed” is not evidence.
Everything marked Working is proven at the signalling layer. Two-way audio has not been confirmed on any call, so voicemail recording, IVR DTMF and fax remain unproven regardless of how complete their code looks. mvp.md item 1 is that test.
Where the product is
| # | Area | Status | Notes |
|---|---|---|---|
| 1 | Multi-tenancy & administration | Working | Tenant = better-auth organization; requireTenant refuses an unscoped request |
| 2 | User management & authentication | Working | better-auth, RBAC via createAccessControl, no self-service registration by design. Users page in the portal, roles enforced server-side per request, password reset by email verified end to end. The installer creates the first account and tenant |
| 3 | Extension & device management | Partial | Extensions work; one credential set per extension. Multi-device in backlog |
| 4 | Dialplan & call routing | Working | Extension-to-extension, inbound DID and outbound-to-carrier all verified by placing calls. Signalling only — see the media note below |
| 5 | Call features | Working | Ring groups (simultaneous fan-out + failover), time conditions and the forwarding/DND feature codes all verified by placing calls. No MoH management or parking |
| 6 | Voicemail | Partial | Reached and answered (*97, ring-group failover) with prompts loading; no message has been left or delivered to email, and that needs real audio |
| 7 | IVR | Partial | A call traverses the menu and the timeout destination is honoured; DTMF selection needs a real endpoint |
| 8 | Conference rooms | Not started | backlog |
| 9 | Call centre / contact centre | Schema only | A bare queue table. The big one — design |
| 10 | CDR & reporting | Partial | CDR ingest wired; call list with filters, aggregate summary and CSV export in the portal. No reporting beyond that |
| 11 | Real-time monitoring | Not started | ESL client exists (services/esl.ts); no wallboard |
| 12 | Trunks & providers | Working | Encrypted credentials, Kamailio projection, and outbound delivery to a carrier verified |
| 13 | Contacts & directory | Not started | backlog; mod_cidlookup is built and unused |
| 14 | WebRTC & softphone | Untested | WSS listens and rtpengine is in the media path in config; no browser client has connected. A native softphone does register |
| 15 | System administration | Partial | Installer, four-question wizard, one-line bootstrap, health checks and log rotation work. DNS records created automatically via Domain Connect or a Cloudflare token. Backups run and have never been restored |
| 16 | Integration & APIs | Partial | The REST API is the integration surface and the portal is a client of it. Audit trail readable via /api/audit. No webhooks |
| 17 | Billing & invoicing | Not started | v1 marked this complete; it was not — design |
| 18 | Call transcription & AI | Not started | Premium in v1’s plan |
| 19 | AI digital receptionist | Not started | See below |
| 20 | FAX | Untested | Inbound fax to email is written end to end (fax_receive.lua, /fs/fax, services/fax.ts) with T.38 via mod_spandsp; no fax has been sent or received |
| 21 | SMS / messaging | Not started | v1 marked complete; schema only — backlog |
| 22 | Hospitality / hotel module | Not started | Speculative |
| 23 | Omnichannel | Not started | Speculative |
| 24 | Storage & infrastructure | Partial | Local disk plus scheduled pg_dump; no object storage |
| 25 | Grafana monitoring | Not started | prometheus-node-exporter is installed by 52-monitoring.sh |
| 26 | ClickHouse analytics | Not started | Premium in v1’s plan |
| 27 | STIR/SHAKEN | Partial | 33-stir-shaken.sh exists, off by default; source build currently fails on Debian 13 |
Editions
v1 split the product into a free Basic edition and a Premium contact-centre edition, with the call centre, transcription/AI, ClickHouse and HA as the premium line. That split is worth keeping in mind while building area 9, because it determines whether the call centre is a bolt-on or an assumption — but nothing in this codebase enforces an edition boundary today, and adding one before there is a product to sell would be the wrong order.
Notes on specific areas
4 — Call routing. All three paths were broken and are now fixed and verified: outbound died
in Kamailio’s empty dr_* tables (and again in mod_hiredis corrupting the route pattern), while
extension-to-extension and inbound DID both died because FreeSWITCH held no registrations —
endpoints register to Kamailio. See CLAUDE.md for the mechanics. Registration is now proven on
real hardware, but media has still never been tested — only signalling; mvp.md
covers what that leaves open.
9 — Call centre. The largest single gap and the best-documented part of v1. The architecture is
settled: mod_callcenter runs the queue, we own configuration and history. See
design/call-centre.md.
17 — Billing. Blocked on nothing technical. The design is in design/billing.md; the decision it needs is whether prepaid (real-time credit control on the call path) is in scope, because that is most of the work.
19 — AI digital receptionist. v1 had a 255-line design document and a six-table schema
(ai_receptionist_config, ai_intents, ai_training_data, ai_conversations, ai_messages,
ai_analytics). It is an IVR whose branching is driven by speech recognition and intent matching
rather than DTMF, which means it slots into the existing destination model — an AI receptionist is
just another destination type resolved by qwixbox.go. The hard parts are latency (speech
recognition sits on the call path, where the existing budget for a Redis lookup is 200ms) and cost
per minute. Not designed further here; the schema is recoverable from the archived v1 repo at
6c4ea50 if it is picked up.
25 — Grafana. 52-monitoring.sh already installs prometheus-node-exporter and its
collectors, so host metrics are being produced and nothing consumes them. That is the cheapest gap
on this list to close.
27 — STIR/SHAKEN. Worth knowing before planning: the libstirshaken source build currently
fails on Debian 13 with a deprecated OpenSSL API under -Werror. The step is off by default, so
this does not affect installs, but the area is not simply “not enabled”.