QueueMetrics 26.10

This release brings AI into QueueMetrics in a practical, controlled way: calls can be transcribed, transcriptions can be browsed and corrected as chats, and Quality Assurance forms can be graded automatically by a Large Language Model. At the same time, we have rebuilt the way QueueMetrics is installed and run, tightened security throughout, and removed the old Icon Agent Page for good.

qm2610 rel

There are also a number of other highlights, as detailed below:

  • Standalone installation: a single file, a few commands, and QueueMetrics is running

  • Automatic check for outdated versions

  • Audio transcriptions, displayed as chats you can search, edit and jump through

  • Chat and WhatsApp integration

  • Automated QA, with AI-assisted grading

  • Ephemeral data, for short-lived values coming from external systems

  • Native Wombat preview dialing directly integrated into the Agent Page.

  • Restricted user administrators

  • Security hardening across the whole application

  • The Icon Agent Page has been removed

QueueMetrics 26.10 can be readily accessed through various means: a standalone package or a Docker image available on DockerHub. We do not distribute native packages anymore, as the new standalone package just works on RedHat/CentOS/Rocky Linux, Debian and Ubuntu, Fedora, openSUSE and Gentoo.

If you are not confident in updating on your own, we suggest purchasing a Remote Support Pack so that our own support team can do it for you. Users of our QueueMetrics Live service will have their instance updated automatically.


A word on security

Every piece of software that sits on a network is a target, and a call center system is a particularly interesting one: it holds phone numbers, call recordings, and now also transcriptions of what was said. It also talks to your PBX. Most real-world incidents are not caused by clever attacks, but by old software, default passwords, and services exposed to the Internet that nobody remembered to close.

In this release we have done a thorough security pass on QueueMetrics itself:

  • A comprehensive audit was carried out to prevent cross-site scripting and CSRF

  • The AMI and SMTP testers, which by design can connect to any host, are now rate-limited (5 runs in 5 minutes per user) and every run is written to the audit log. The SMTP tester no longer reuses the stored SMTP password.

  • The system configuration hides secrets, and parameter fields are sanitized.

  • Single Sign-On re-entry has been checked and fixed.

  • User administrator roles can now be restricted (see below).

Our best advice remains the simple one: keep QueueMetrics up to date, do not expose it directly to the Internet if you don’t need to, and use strong passwords. QueueMetrics will now notify you if it is running an outdated version.

Install from scratch in minutes

Project "Burrito" is now a reality: QueueMetrics can run as a single standalone JAR file that embeds its own web server. There is no application server to install and configure; you only need Java and a database.

The standalone package includes:

  • an installer script and a systemd unit, so that QueueMetrics starts at boot and can be managed like any other service;

  • a command-line tool, queuemetrics-cli, to start, stop, inspect the running system and see the logs;

  • a version command that shows the QueueMetrics, Tomcat and Java versions, and clearly reports in the log when the database connection is not working;

Installation or upgrades are now just one line: curl -sL get.queuemetrics.com | bash.

QueueMetrics now requires Java 25, the new long-term-support release, with the dependencies modernized accordingly.

Are you running an old version?

QueueMetrics now checks whether a newer release is available and, if yours is out of date, shows a notification in the home page. The check is cached, so it does not slow down the system, and it simply stays silent when there is nothing to report.

This is a small feature, but an important one: the most common cause of problems that we see in support is a system that has not been updated in years.

Audio transcriptions

QueueMetrics can now transcribe call recordings through external speech-to-text services. We offer compatibility both with the most common SaaS offerings (DeepGram, OpenAI…​) and local servers (WhisperX, Kroko-AI). Transcriptions are handled by a pool of "AI Workers", configured from a dedicated editor:

  • you can define several servers, with different priorities, and tag them depending on what they do;

  • calls are assigned to the first available worker, and a failed transcription can be retried;

  • a live view shows what each worker is doing, including the cost of the transcription expressed in input and output tokens;

Transcriptions are tracked directly against the call they belong to, so they can be found easily from reports and from the QA pages. A set of web services lets external systems write and read transcriptions too.

In order to run transcriptions, you need Uniloader 26.10, released jointly.

And what about chats and WhatsApp?

It is now possible to upload chats to QueueMetrics, streaming them in real-time as they happen. The API is publicly documented, so you could easily integrate your own.

We are teaming with a WhatsApp service to offer an all-in-one multi-channel solution.

Chats

Transcriptions are displayed as chats, in the same way as WhatsApp-style conversations. Chats are shown next to the call in the report and in the QA page, and they are fully interactive:

  • multiple speakers are shown with different colors, and each segment has its start time;

  • clicking on a timestamp jumps to that point in the call recording;

  • speakers can be renamed and segments can be re-assigned to a different speaker, to fix the mistakes of the automatic diarization;

Automated QA

QA forms can now be graded automatically, out of transcribed calls or chats/WhatsApp. In the QA form editor, a new "Automated QA" section holds the AI prompt used to grade that form, and each item can have an explanation that is passed to the model along with the question.

  • The Grader page has a new AI-assisted mode that grades a whole set of calls for you; the classic manual grader is still there.

  • A "Test AI dialog" button in the form editor shows exactly what is sent to the model and what comes back, so you can fine-tune a prompt without grading real calls.

  • Both OpenAI-compatible and Anthropic servers are supported; for Anthropic, prompt caching is supported to reduce costs.

  • The transcription is shown in the QA report popup, and the QA form is displayed next to the AI grading results.

The grading is meant to assist supervisors, not to replace them: all results can be reviewed and changed by a human.

The Icon Agent Page is gone

As announced, the old Icon Agent Page has been removed from the product, together with its documentation. The Agent Page has been the recommended choice since 2023, and a migration guide for your agents is available here: https://www.queuemetrics.com/blog/2026/01/16/migration-to-the-new-agent-page/

All agents on the system are automatically switched to the new agent page.

Ephemeral data

Some information is only meaningful for a short time: the temperature of a room, whether a customer is waiting on a web page, or the remaining calls for an outbound campaign run on a WombatDialer server. QueueMetrics can now display these values on its wallboards. They are stored in a table of ephemeral values, each one identified by an attribute name, a queue and an agent, and expiring on its own.

  • External systems write and read values through two simple web services, with new dedicated security keys.

  • An inspector page shows the current values.

  • Two new Wallboard widgets can show these values live, together with WombatDialer data.

WombatDialer integration

Agents can now run preview dialing campaigns directly from the Agent Page, thanks to a native integration with WombatDialer that replaces the need for an external iframe. A WombatDialer icon in the navigation menu shows a badge with the number of reservable calls across the agent’s active queues, read from the ephemeral data table.

From the panel, agents can reserve a contact, review its details and call history, then dial or skip it, choosing a reason from a configurable list. The contact’s input attributes are shown to the agent, and any of them can be turned into a link to a CRM or other external system.

When the call is connected, agents set the outcome, using either a custom list or the standard QueueMetrics call outcomes, and can add custom output fields such as comments or reason codes, as free text or dropdowns.

Misc

  • Docs in reports: every data block now has its own documentation, available from the report editor and in the report itself. Just click on it! The same descriptions are also returned by the JSON API.

  • Pauses triggered during a call: an agent could be put in pause, or logged off, while on a call, and the action would create a small anomaly: the session would finish while the agent was still on a call. These actions are now automatically deferred until the call ends. This means you can pause an agent with an active call, and the pause will make sure that they will receive no more calls until unpaused, and presence time will be correct.

  • Restricted admins: a new USRADMIN_RESTRICTED key limits what a user administrator can do. They can only create, clone and delete users in the classes listed in a default set, and can never touch custom keys, the master key, or classes. Handy when a team leader needs to manage their own agents but nothing else.

  • Protection against multiple instances: QueueMetrics detects when it is already open in another browser tab and warns the user, avoiding the confusing effects of two sessions working on the same data.

  • Slow WebRTC: the establishment of a WebRTC session over a VPN could take a long time. New properties and quick-config options let you tune the ICE negotiation and avoid the delay.

  • Covering index and database updates: a new covering index speeds up the most common queries on the queue_log table, and two unneeded indexes were dropped. New systems are installed with the new table schema, but we don’t do it automatically for existing systems as it might require hours to run. An update script is available.

  • Sub-queue mode has been removed, as well as the old Autoconfig verb and the qa gradecall page.

  • Data block tables can be sorted by time on all data blocks, and outcome filters now search by substring.

  • Several improvements to the Agent Page, including WombatDialer preview dialing, pending recalls and per-user control of the queue join policy.

Improvements to Uniloader

Uniloader gained a new uniloader transcribe service: it transcribes call recordings and uploads the results to QueueMetrics. It supports several drivers (OpenAI, OpenAI-compatible, Deepgram and Kroko-AI) and can split stereo recordings by channel, so each side of the call is labelled as agent or customer. It processes the backlog newest-first, can sample only a share of the recordings, reports transcription fees and logs HTTP traffic for troubleshooting. It also ships with a systemd unit.

Smaller improvements:

  • A new test ws command for websockets.

  • SQLite3 support in dbtest.

  • Tracking who made changes: cfgfile put --signed-as.

  • A single uniloader User-Agent on all HTTP clients.

Detailed change list

API

  • #7001: JSON report API doesn’t show caller number if known number is set

  • #7695: New QA services

  • #7700: Transcription leaderboard

  • #7813: IndexOutOfBoundsException in DOFactory.DOasReportItem

  • #7841: Track transcription costs

  • #7844: Back-end: edit chat

  • #7845: Renaming "leaderboard" to "transcription_servers"

  • #7903: API returning block descriptions

  • #7966: Fail reservation if chat already present

Agent Page

  • #7632: Better WombatDialer integration

  • #7655: Case "null" cannot be written

  • #7656: Error saving Case

  • #7671: Show more queue name characters in QAP queue list

  • #7722: Per-user control of queue join policy

  • #7726: Display pending recalls

  • #7727: Agent page: WD preview dialling

  • #7734: Performing actions on WD preview page

  • #7832: Wombat Reserve button should be disabled if agent on pause or no available call to reserve

  • #7835: Re-activate assertExtensionNotInUse

  • #7849: Wombat Ext status dropdown should use qm call outcome if agent.wombatAttr.extStatus is empty

  • #7850: QAP: agent with an assigned server cannot delete it from configuration

  • #7968: Preselect default outbound Queue when at least one is available

Chats

  • #7716: Svc for tracking transcriptions

  • #7736: MIME types supported by Kewbot

  • #7781: Accept absolute time for chat segments

  • #7905: Natively track call-id on transcriptions

  • #7941: Chats Edit accepts the same name for different speakers

  • #7943: Chat: Chat Delete (Backend)

  • #7958: The user will be able to retry the transcription if the previous attempt failed.

Configuration

  • #6655: Convert key and properties editor from Json to Java

  • #6993: Explore system parameters: properties sidebar sometimes doesn’t work correctly while scrolling

  • #7340: Not possible to upload the AMO CSV list when using the ESP language

  • #7623: System configuration leaking secrets

  • #7646: Passwords cannot be longer than 30 characters, but the input validation is currently missing from the user configuration.

  • #7664: callListen.listeners.MirtaPbxListener does not have a timeout

  • #7696: Hide "insert license" if running standalone

  • #7717: Configure transcription services

  • #7718: Display transcription leaderboard

  • #7724: Webservice and table ephemeral_ext_data

  • #7733: Inspector page for current_ext_data

  • #7735: New security keys in User editor

  • #7740: Ephemeral data attribute name limit

  • #7836: AI Workers editor

  • #7855: Display transcription costs

  • #7897: Add description field to QA items

  • #7916: Display sample LLM dialog

  • #7959: The parameter fields need to be sanitized.

  • #7967: DBInspector refreshes non-stop if you write a letter in the refresh time

  • #7974: Dump presentialist status

  • #7983: Transcription Tags TD/TR/QA are not clear

  • #8023: Install new license as web and webservice

  • #8031: Restricted user admins

DB

  • #7569: Error 'unique_row_count' doesn’t have a default value

  • #7770: Security bypass in dbtest pages

  • #7891: ERROR 1071 (42000) at line 2294: Specified key was too long; max key length is 767 bytes

Docs

  • #7692: Documenting IVR best practices

  • #7742: Remove queuemetrics-espresso

  • #8022: Remove Icon Agent Page Docs

Engine

  • #6800: Session is not serializable for CachedDbRewriter$Cache

  • #7397: Pause sessions can be triggered within a call and Agent session terminating when on call

  • #7653: ConcurrentModification solving variables

  • #7666: Call Filter in NOT mode doesn’t work

  • #7821: Ignore specific agents: default.skipAgentChannels

  • #7828: java.lang.IllegalStateException: Error starting child

  • #7876: [Exception] LicenseException

  • #7878: Turn verbs string constants into an enum

  • #7885: Remove sub-queues

  • #8016: Engine handles decimal time durations

Graphics

  • #6873: Detect if QM is already open in a different tab

  • #7605: Feedback when entering free text with the feature code.

  • #7875: Improve the error message displayed on the Agent Page when the license limit is exceeded.

  • #7913: Improve layout of QA forms editor

  • #7936: Page transcription.jsp is hard to read in Dark mode

  • #7961: Add the "Go to Live View" button to the Transcription Server page as well.

  • #7965: A button for quick access to Transcription Server configuration from Live View Transcription

Home Page

  • #7889: Notify outdated systems when a new release is present

  • #8026: Repeated string "malformed version string"

Icon Agent Page

  • #7553: Remove Icon Agent Page

Packaging

  • #7547: QM won’t start for a long time

  • #7556: Move /includes to /WEB-INF/jspf

  • #7557: Product name in error notification

  • #7654: Do not forward UserException errors

  • #7658: Name of QueueMetrics for error reporting

  • #7668: Add covering index for queries

  • #7690: Results not logged for some verbs

  • #7691: Project Burrito: run QM as a single Uberjar

  • #7697: Systemd unit for Standalone

  • #7714: Setup custom Tomcat

  • #7737: Standalone: 3rd-party license files and dupes

  • #7741: Create Docker image based on standalone

  • #7743: Install from get.queuemetrics.com

  • #7746: Library versions in THIRD-PARTY

  • #7747: Show Tomcat version

  • #7748: License page - database version shows incorrectly

  • #7750: Standalone: version numbers + whether DB is present

  • #7780: Use picocli for CLI

  • #7787: Java 25: Compile and test Java

  • #7788: Java 25: Create JS clients and themes

  • #7789: Java 25: Create uberjar

  • #7790: Java 25: Modernize deps

  • #7792: Java 25: Modernize H2

  • #7793: Java 25: Fix deprecations

  • #7794: Java 25: check different builds

  • #7796: Java 25: Check all tests are included

  • #7797: Reactivate QA commit

  • #7799: Java 25: CLI improvements

  • #7802: Java 25: Check all Gradle tasks are retained

  • #7803: Java 25: Using Hebrew

  • #7804: Java 25: Slow shutdown

  • #7805: Java 25: all log goes to STDOUT

  • #7806: Java 25: Integration tasks

  • #7857: Build QueueMetrics with the new parameter PRODUCT_VERSION

  • #7870: Check escaping for error page

  • #7872: Security hardening

  • #7895: Cannot mount webapp as root folder

  • #7906: Chanspy/Whisper/Barge in French translations

  • #7918: Set custom UserAgent for QM

  • #7927: Command queuemetrics-cli is missing from package

  • #7929: New settings for QA in default db

  • #7948: Most subcommands of queuemetrics-cli are broken

QA

  • #7608: MiRTA PBX Listener doesn’t use MediaProxy

  • #7702: There is a problem when trying to use the Queue visibility in the QA form

  • #7816: Improve QA layout

  • #7831: Auto-QA – QA form database schema and queue editor changes

  • #7890: AI-assisted Grader’s Page

  • #7896: Improve layout for Graders page

  • #7898: Display description of QA item

  • #7915: Grading page: new property qa.minPrcAllCalls

  • #7919: Manual QA grader checks for AI prompt

  • #7925: Position of red dot, missing graded By

  • #7926: Layout of QA editors

  • #7930: QM Https Client should use SNI

  • #7938: Support Claude’s cache control

  • #7951: Support Kroko-AI

  • #8004: Transcription doesn’t show up in QA report popup

  • #8010: Display QA form on Automated QA grading page

  • #8013: Optimize the view when checking the QA Summary.

  • #8032: Trying to reopen a deleted QA from a QA report gives TechException

Reports

  • #6592: OptiLock Report save issue

  • #6923: Call results, by outcomes (OU02) grouping not showing calls

  • #7218: The default queue selected when you create a new report is "00 All." If you disable this queue, it is still shown in report

  • #7676: Report Date field fails to parse 'MM' and 'MMM' month formats

  • #7685: Displaying audio transcriptions

  • #7837: Chats: find audio transcriptions

  • #7838: Chat: Jump-to-offset in recordings

  • #7839: Chat: multiple speakers

  • #7840: Chat: display start time

  • #7843: Chat: Editing

  • #7847: Chat: Close/Open multiple calls results in merging multiple chats

  • #7904: Display docs for each data block

  • #7942: Chat: Chat Delete (FrontEnd)

  • #7953: Outcome filters search by substring and not by exact match

  • #7998: Many chat tabs with long name, make the chat right side too big

  • #8012: Enable chat speaker re-assignment

  • #8027: DataBlock time sort column doesn’t work on all data blocks

Security and technical debt

  • #7874: Security audits: avoid XSS injections

  • #7879: Quote field names in QlogTwoLevelcache

  • #7880: Use enum constants for verbs

  • #7950: Avoid XSS risks in Decorators

  • #8008: Vulnerability: Possible server scan or creds exfiltration using testers

  • #8020: Check SSO re-entry

  • #8024: Remove Autoconfig verb and associated pages

  • #8025: Remove qa gradecall

Softphone

  • #7633: Slow WebRTC session establishment on a VPN

Wallboards

  • #7665: [Wallboard] Add disconnection cause filter

  • #7687: Wallboard quick agent actions don’t work with mirtaPBX

  • #7725: New WD and ext_data widgets

  • #7744: New WD and ext_data widget backend

  • #7833: Wombat widget with required queue shouldn’t have "All Queues" as first item

  • #7920: Agent page inside agent page inside agent page inside agent page inside

  • #7975: Live Agents, filtered by queue doesn’t show correct members of queue

  • #7978: Wallboard: Status is not correct if agent description has spaces

  • #7999: Creating a new wallboard should prompt to add a widget instead of defaulting to a time widget

Uniloader

  • #6368: Support dbtest with SQLite3

  • #6780: Unitracker system file uses incorrect parameters

  • #7017: cfgfile put: new --signed-as option

  • #7281: Test audiovault: honor --cacert option

  • #7570: Add-user: --locked - make it unchanged

  • #7699: Command "uniloader transcribe" and related improvements

  • #7709: Dedupe: fix column count mismatch and improve zone logging

  • #7753: Transcribe: process backlog newest-first by mtime

  • #7754: Transcribe: stereo channel splitting via --stereo-agent L|R

  • #7755: Transcribe: split OpenAI and OpenAI-compatible drivers

  • #7756: Transcribe: --http-log file for full HTTP request/response trace

  • #7759: Transcribe: replace empty speaker label with "UNKNOWN" on upload

  • #7822: Transcribe: fix OpenAI diarized_json format and stuck driver

  • #7823: Transcribe: add Deepgram driver

  • #7854: Transcribe: report transcription fees

  • #7922: Transcribe: Kroko-AI driver and audio format per driver

  • #7931: Systemd unit for uniloader-transcribe

  • #7940: Convert Gradle tasks used to run Sonar to Gradle 9.7 / Java 25

  • #7957: Transcribe: use uniloader UserAgent for QM, OpenAI and Deepgram HTTP calls

  • #7962: Log final transcription errors

  • #7963: When reserving, check if chat exists

  • #7964: Always use uniloader UserAgent in all HTTP clients

  • #7970: Transcribe: accept flat segments from whisper-1

  • #7971: Error with TR will not cause unreserve

  • #7973: Transcribe: segment order in stereo merge

  • #7980: Use raw stereo files created by Asterisk

  • #7981: Display allowed tags for driver

  • #7982: Uniloader test ws