Release notes

What changed in each Voiplix version, newest first.

Every Voiplix release comes with a short list of what changed, written for operators. The same notes appear on the Update page of your system before you install a new version (see Updates & license).

Latest releases

v2.2.6

Released 2026-09-24

  • Manual step (operator, in a maintenance window): after the update run the root setup step from the installed tree, then switch on tenant separation (scripts/maintenance/tenant-dialplan.sh on). Until then internal dialling works as before.
  • Tenant separation: after the switch a phone reaches only the extensions of its own customer (and of users in the same PBX pool). The endpoint context of every device changes from voiplix-from-internal to voiplix-from-internal-<user id>. New installations are separated by default.
  • This release contains database migrations: the update makes a database backup first and takes longer.
  • Update: the automatic database backup made before an update can no longer be deleted by its own clean-up; old backups are ordered by version number and folders without the update marker are never touched.
  • Voicemail and other Asterisk prompts play in the language of the device or DID: German, French and Italian sound packs are installed by the root setup step (the release is about 7.5 MB larger).
  • Internal calls are free (phone to phone, phone to ring group or queue, the leg of a member): price 0, no deduction, the call stays in the call list.
  • Call transfers are billed as follows: a transferred incoming DID call stays free and the part to an outside number gets its own row; a transferred paid outside call is charged for the whole time the outside party stays connected; ringing time is not charged.
  • Calls from devices or via providers with Anti-Resale Auto-Answer (or a pre-dial announcement in answer mode) are charged from the moment the provider answers; busy or unanswered attempts show 0 seconds.
  • Emergency and service numbers (112, 144, 116117 and others) can no longer be used as the number of a device, ring group or queue; an existing entry is left out of the dialplan and reported.
  • Incoming DID calls to a device follow its call forwarding (busy, no answer, unreachable, before call); the forwarded part is billed to the owner of the device, an internal forwarding target is free.
  • Voiplix's own Asterisk files move to /etc/asterisk/voiplix.d/ (root setup step, once per system); only Asterisk and Voiplix can read them.
  • Quickforward DIDs work: a known caller is forwarded and billed; unknown callers and callers without a forward number are rejected without answering (902/903) and listed in Calls with price 0.
  • Balance, remaining time and call rate announcements: when a word is missing from every bundled sound pack, only the number is spoken as in v2.2.5; for unlimited time or a rate of 0 that part is skipped.
  • Call limit: prepaid only the balance, postpaid balance plus credit limit; unlimited only with credit -1.
  • IVR "dial extension" reaches only devices in the IVR owner's area.
  • pjsip_extra per section of a device ([endpoint], [aor], [auth], [identify]); extra lines for the global transports as a system setting (admin only, applied with an Asterisk restart). Results of Asterisk checks are shown in the user's language.
  • Time periods for "before call / no answer / busy / failed to voicemail" use the time zone of the device owner; new page "Personal details" for the own time zone.
  • PBX pools, with pool 1 "Global"; users in the same pool reach each other. A pool that a reseller created earlier under number 1 gets a new number.
  • Phone keys for transfer and recording work on Asterisk 21 after the root setup step (blind transfer ##, attended transfer *2, disconnect *0, recording *1).
  • The Docker installation runs the application as a normal user instead of root.
  • Device and DID language codes are checked when saving.

v2.2.5

Released 2026-09-23

  • Access control now applies to every signed-in account, not only to system logins. A page that a role must not open now redirects to the no-access page instead of relying on each page to say so itself.
  • Fixed: the Profit page had no permission check at all and could be opened by resellers, partners and end customers by typing its address, although the menu never offers it. For partners and end customers it showed the operator own purchase price, and therefore the margin. The same applied to Loss-making calls and Users finances.
  • The Languages page is open to every signed-in account again - it lists your own languages. Only the default-language setting still needs the settings permission.
  • The Default device settings page now needs the device permission (which resellers, partners and accountants have) instead of the settings permission.
  • Recordings: a recording you hid in your portal can no longer be played or downloaded through its direct address. A recording removed by the cleanup still answers 410 gone, not 403.
  • IVR free-text fields now accept only a fixed list of Asterisk variables and reject anything else with a message that says what is allowed, instead of silently stripping it.
  • XML/REST interface: a partner account no longer receives every DID of every tenant and can no longer create or assign DIDs. NOTE: the interface always answers HTTP 200 - a script that only checks the status code will not notice the change.
  • XML/REST interface: an accountant account can now terminate, close, free and stop the subscription of a DID, and can use the location-rule methods.
  • XML/REST interface: admin accounts whose user id is not 0 can use the DID and location-rule methods at all - until now they silently found nothing.
  • The LCR list on the location-rule form now shows only the LCRs of your own tenant.
  • Music on hold, monitoring and server settings now require an operator-level account, not only the matching permission.
  • New automated release check: 21 places that hide passwords and keys are pinned, so a later change cannot remove one unnoticed.
  • An automated write-path check now also asks whether a write addressed by a row number ever loads that row.
  • The installer now switches off the Asterisk modules func_shell, func_curl and func_env. NOTE: this takes effect only after a full Asterisk restart.

v2.2.4

Released 2026-09-22

  • Three settings on the device form — "Send recording to email", "Recordings email" and "Keep recordings on disk after sending by email" — are saved but have no effect today, because sending recordings by email is not connected yet. The form now says so in plain words instead of looking like a working switch. Nothing is removed: the value you set is kept and will start working once email sending is in place.
  • "Hide all" and "Show all" recordings for a customer now work in blocks instead of one single statement. On the larger installation this was one instruction over 831,581 rows on the busiest table of the system, while calls were running. Each block is now a short step of its own, the run reports how many entries it really changed, and if it runs out of time it says so and the next click continues where it stopped.
  • Recordings that were automatically cleaned up are now left alone by "Hide all" and "Show all". Their audio file is gone; the entry stays in the list as a record, exactly as promised in the previous release, and is no longer rewritten.
  • It is recorded in the audit log who hid or showed recordings, and how many. Until now there was no trace at all: on one installation, tens of thousands of recordings were hidden from the customer, and nothing said whether a customer asked for that or whether staff simply made them invisible.
  • A recording that was automatically cleaned up can no longer be deleted by hand, neither one at a time nor as a selection. The previous release promised that such an entry stays in the list as proof; the delete button could take that promise back.
  • A recording whose audio file was empty — a 44-byte file header with no sound in it — no longer claims a file that is not there. New ones are marked at the moment the empty file is discarded. For the entries that already exist there is a separate run that we start by hand on each installation, in a quiet window, after asking you: it checks every file before it touches anything and leaves every entry whose file is really there.
  • The XML interface no longer hands out cleaned-up recordings. Its answer is capped at 5,000 entries, and entries without a file were taking places away from real recordings the longer the nightly clean-up had been running.
  • The recording permissions page now has page navigation. Until now it showed the first 100 customers and the rest were simply not reachable — on the page where the retention period is set, and that period deletes files.
  • The same page now shows, for each customer, how many of their recordings are hidden from them and how much disk space those take. There is deliberately no delete button next to it: for the existing entries it is not established who hid them, and for the larger part nobody did — the device setting "show recordings to the user" decided it when the call ended.
  • A new report, started by hand, counts recording files on disk that have no database entry at all, with their age and their size. It only counts. It deletes nothing and proposes nothing; what happens with those files is your decision, and this report is there so that the decision rests on a measured number.
  • Two new checks now run in every release build. One refuses any future version that writes to the large tables — calls, call attempts, recordings — without a provable limit. The other refuses a form field that is saved but read by nobody: exactly the kind of defect that made the retention period look like it worked for a year while nothing was ever deleted.
  • That second check immediately found three more fields of this kind that nobody had noticed: two announcement settings on the device form, and a minimum charge on the customer form. They are listed for you to decide on individually; nothing about them was changed in this release.

All releases by series