Release notes — Versions 1.0 – 1.8
What changed in each versions 1.0 – 1.8 release, newest first, as published with the release.
v1.8.0
Released 2026-09-01
- Release notes are now complete, and in English, for every version. Until now this list showed a version number and nothing else for 70 of 82 releases: the release builder wrote the notes in a format the page silently discards, so the notes existed on the release server but never reached your screen. All of them have been restored, and the older entries - which were written in German - have been translated. If you have never seen anything useful on this page before, this is why.
- The release builder now refuses to publish a version without notes, and writes them in the format this page reads. The gap above could only stay open because the rule existed in our documentation but not in the tool.
- This version closes out the work released as v1.7.8. If you are updating from v1.7.7 you are getting both at once - read the v1.7.8 entry below for the dashboard CPS counters, the hardware tiles, customer statistics, the paginated call list, billed seconds in customer-facing durations, and the security fix for the live calls feed. The application code in this version is otherwise identical to v1.7.8.
v1.7.8
Released 2026-09-01
- Live CPS on the dashboard and on Live Calls. A new counter shows call attempts per second - the signalling load arriving right now - next to the existing counters for active and connected calls, with a 10-second average underneath so the number stays readable. Two more tiles record the highest CPS burst and the highest number of concurrent calls of the day, so you can see what your system actually had to carry. The counter is measured in the background service at the moment a channel is created, which means it also counts attempts that never become a billable call, such as rejected calls and scanner traffic - exactly the load you look at CPS for.
- ASR and ACD in Quick Stats. The dashboard table now shows the answer seizure ratio and the average call duration next to the existing figures. Note that the row labelled Calls has always counted answered calls only; the new Attempts row shows the total the ASR is calculated against.
- Hardware at a glance on the dashboard. CPU load, memory, disk, uptime and operating system, plus Asterisk and database status, are now shown directly on the start page for admins and accountants. The figures are read inside the application without starting a single external process, so keeping the dashboard open costs nothing - unlike the status page, which spawns sixteen processes per refresh and is not used for this.
- New: Customer statistics under Statistics. The counterpart to Provider statistics, with calls, answered, ASR, ACD, duration, revenue, cost and margin per customer, a customer filter and a totals row.
- The Aggregate report has moved to its own page at Usage and now has a sidebar entry. It used to exist but was reachable only through a tile on the CDR management page, so most operators never found it. The old address still redirects, including all filter settings, so existing links and bookmarks keep working. The report also shows billed customer seconds and billed provider seconds, which it had always calculated but never displayed.
- The call list is paginated. Instead of only a row limit you now get clickable page numbers with previous and next, and the header tells you how many entries matched and which page you are on.
- Durations shown to customers are now billed seconds. The call list, its duration tile, the customer portal, the CSV export and the revenue statistics now show the seconds actually charged - the value the price is calculated from - instead of raw talk time. The two differ whenever a tariff rounds up to a billing increment or applies a minimum time. Technical figures deliberately keep using raw seconds: average call duration, answer seizure ratio, talk time, hangup causes, and provider statistics, which now correctly use provider-side seconds. Be aware of two consequences: a call inside a device grace time and a call by a customer without a tariff are billed as zero and will therefore show 0s.
- Please read if you process our CSV files: in the calls-per-day export the column previously named billsec is now named user_billsec, because its content changed with the point above. A script that reads that file by column name will now fail loudly instead of quietly using the wrong number.
- Security fix: the live calls feed accepted connections without any login. Anyone who could reach the web address was sent the complete list of active calls across the whole system - numbers dialled, caller IDs, devices, customers and providers - as it happened. It now requires an admin or accountant session; every other request is rejected. There is no indication this was used, but on a multi-tenant installation it was a real exposure between customers and it is closed with this version.
- Fixed: the tile titles on the CDR management page were hardcoded in German and stayed German on an English installation. All ten now follow the selected language.
- Fixed: the CSV export of the call list ignored the filter for calls with multiple attempts. You could filter the list down and still get every call of the period in the file.
- Fixed: alerts of the type simultaneous calls never fired. The alert could be created and looked normal, but the evaluating service did not know the type and skipped it without a word.
- Fixed: the per-device and per-provider CPS windows grew without limit on any device or provider that had no CPS limit configured - which is the normal case. Memory was only released when the background service restarted.
- Fixed: re-rating calculated with truncated seconds and silently reduced the billed time and price of calls that had been rated from the more precise measured duration. It now uses the same duration as live rating, and it refuses to run over a period that already contains paid invoices. Please note that re-rating still does not adjust customer balances - that has always been the case and is unchanged here.
- This version adds two tables for the live and peak figures. Peak history is kept for 400 days, adjustable through the Call_peaks_retention_days setting.
v1.7.7
Released 2026-08-31
- Caller ID pools now fall through by priority. Assign several pools to a device under Devices > CID pools and order them: when the pool at priority 1 has no usable number left - every number in cooldown or quarantine - the next one takes over automatically, then the one after that.
- Fixed: this is what previously caused a customer outage. The engine already read the pool list and its priority, but it only checked whether a pool CONTAINED numbers, not whether any of them was USABLE. A pool with 100 numbers all in cooldown passed that check, the provider was then skipped for lack of a caller ID, and every call ended with 'No suitable providers found' - while the next pools sat there untouched.
- The call log now names which pool a number came from, and records when a pool was skipped as exhausted, so a pool running dry is visible instead of silent.
v1.7.6
Released 2026-08-31
- Fixed: the Asterisk fail2ban jail never blocked anything. Its port list carried a protocol suffix (5060/udp), which is invalid in an nftables port set - both ban actions aborted and no filter rule was ever created, while fail2ban kept reporting addresses as banned. Scanners hammering your SIP port were listed as blocked and carried on regardless.
- Asterisk now starts with a file-descriptor limit of 65536 instead of the Debian default of 1024. A bridged call needs roughly five descriptors, so the old limit stopped new calls at around 190 simultaneous conversations with 'Too many open files'.
- Asterisk's overload protection is now limited to its own SIP queues (taskprocessor_overload_trigger=pjsip_only). Before, one congested queue - for example when the billing worker read AMI events too slowly - made Asterisk refuse every new call.
- The SIP packet capture no longer stores voice traffic. It also recorded the RTP range, which produced 10-11 GB per hour and 66 GB in a single working day on a busy system. This affects only the packet capture behind the SIP ladder diagram - your call recordings under Recordings are made by Asterisk itself and are untouched. Captures are now a fraction of the size and pulling a single call out of them is faster.
- Caller ID pools can now fall back to another pool. When every number in a pool was in cooldown, the provider was skipped and every call ended with 'No suitable providers found' - even with unused pools sitting right next to it. Set 'fallback_pool_id' on a pool to chain it to the next one; leaving it at 0 keeps the previous behaviour.
- Fixed: the privileged helper under /usr/local/sbin was a copy taken at installation time that never updated itself, so later improvements to it never reached an installed system. It is now a launcher that always runs the shipped version.
- Existing installations need one manual step to receive the four host-level fixes above, because their old helper predates this change: sudo bash scripts/maintenance/voiplix-host-fixes.sh (idempotent, writes backups). From then on such fixes are applied automatically with every update.
v1.7.5
Released 2026-08-31
- The integrity check can now clear 'Unprocessed error actions': mark a single entry as done, or all of them at once.
- These entries never disappeared on their own - fixing the cause writes a new log line but leaves the old error standing. The page now says so, so it is clear why an error stays after you have solved it.
- Entries are marked as processed, not deleted: they remain visible in the action log.
v1.7.4
Released 2026-08-31
- The update page now shows the release notes: the newest version is open, every older version can be clicked to read what changed.
- Fix: the integrity check reported 'Servers with low free space' on every system, even with hundreds of gigabytes free. It compared against 1000 GB, while the warning e-mail for the same setting used 10 GB - the same setting was read in two places with defaults that were a factor of 100 apart.
- Fix: 'Unprocessed error actions' only showed a count. It now shows the date and the actual message, so you can see what failed.
- Fix: the DID list left the Reputation column empty for healthy numbers. It now always shows the state (Active, Cooldown, Quarantine, ...).
v1.7.3
Released 2026-08-31
- Fix: while Asterisk is unreachable, the background service wrote roughly 568,000 log lines per minute (about 34 MB). A limiter for exactly this case has existed since v1.7.1's predecessors but never actually worked, because the fault produces two alternating messages and the limiter only remembered one. Measured after the fix: 4 lines in 90 seconds.
- Note: the burst of log lines only appears in one specific situation; follow-up measurements showed no measurable CPU cost and the service reconnects on its own once Asterisk is back.
v1.7.2
Released 2026-08-31
- DID pages: the assigned user and device are now links - one click takes you straight to the device. The DID page also shows who the number is assigned to at all, which it never did before.
- Fix: every confirmation dialog in the application (19 of them - delete invoice, delete payment, terminate DID, sign in as another user, and so on) was hard-coded in German and stayed German in every language. All of them now follow the selected language.
- Fix: after switching the language mid-session, some messages kept appearing in the previous language until the page was fully reloaded.
- The translation check now also covers browser dialogs, so this class of untranslated text cannot come back unnoticed.
v1.7.1
Released 2026-08-30
- Includes everything from v1.7.0 (automatic update check + banner).
- Fix: the background service wrote its log to the wrong file. 'pm2 logs voiplix-background' showed nothing at all, which made the service look silent or dead - the output was going into PM2's own log instead. This affected every installation made by the installer.
- New installations are correct straight away. An existing installation repairs itself during an update - but because the update always runs with the script of the version already installed, the repair takes effect one update later.
v1.7.0
Released 2026-08-30
- The system now checks for new versions on its own, once an hour, in the background.
- When a newer version is available, a banner appears on every page right below the licence line, with a link to the update page. It stays until you update.
- Fix: the update check compared version names as plain text, so an OLDER version on the release server also counted as an update - the button would have downgraded the system. It now compares version numbers properly (v1.10.0 is newer than v1.9.9) and a stable system is never offered a beta build.
- The manual 'Check for updates' button now also refreshes what the banner shows.
v1.6.9
Released 2026-08-30
- The installer and the maintenance tools now speak English - this is the first thing you see when setting up a new server.
- The language you set for a user finally takes effect. Until now only the language switcher in the browser had any influence.
- Fix: after an update with automatic reboot the page could reload straight into the restarting server.
- Fix: two service-restart messages were still German in every language.
v1.6.8
Released 2026-08-30
- The license messages, the customer emails and the invoice PDF now speak the reader's language instead of German.
- Fix: customer names and destination names were DESTROYED in the invoice PDF, not just untranslated - Turkish, Cyrillic and Arabic characters lost their high byte. A Unicode font now ships with the system.
- Fix: the SMTP test email contained the literal text "SMTP_test_message_body" instead of a message.
- Fix: the password reminder email had the machine name "password_reminder" as its subject line.
- Fix: the statement-of-account email greeted customers with "Hello ," because the name variable was never allowed.
- Fix: a rejected call could get the wrong hangup cause because the code branched on a German word in a license message.
- New installations now get English email templates; templates you have already edited are left untouched.
v1.6.7
Released 2026-08-30
- Multilingual: the remaining server messages now travel as keys, not German text.
- Seven module-scope label tables converted completely (settings, default device, default user, CDR export columns, cron actions, health checks, cause rules).
- New message form with values (key + variables), so sentences like "Username must be longer than 5 characters" translate correctly.
- Fix: form hints were rendered raw - /settings literally showed "Legacy_required_field_settings_change" in every language.
- Fix: a CDR export template froze the creator's language into the database.
- Fix: the status page decided on a German word, so the Asterisk restart confirmation never appeared in other languages.
- Fix: 31 tooltips, ARIA labels and placeholders were still German.
v1.6.6
Released 2026-08-30
- Multilingual: every piece of text embedded in the interface JSX is now translated. For the first time since this work began, the i18n guard stands at 0 findings (it started at 4,094 in 462 files). Pages that still show German text on an English installation: 60 -> 13 of 182; the rest comes from lib/** and module-scope label tables and will follow in a separate stage. Tooling: apply-keys.mjs now rewrites ternaries and data attributes as well.
v1.6.5
Released 2026-08-30
- Multilingual: the SMS section and the PBX (IVR, queues, ring groups, PBX pools, PBX features, Cloud PBX) are now fully translated - JSX and non-JSX in one pass. The JSX guard now also sees text in data attributes (rows={[...]}), which no tool had reported before. A new guard, scan-rendered.mjs, checks the RENDERED page in every language while logged in - pages with German text on an English installation: 60 -> 42 of 182.
v1.6.4
Released 2026-08-30
- Fixed: a 500 error on /stats/system-stats. niceNumber(x, 0) asked for a minimum number of decimal places that was higher than the maximum it allowed, and threw a RangeError - the defect predates B8 and only shows up once you are logged in. Fixed as well: 25 labels in system-stats that sat inside an attribute array and were therefore reported by neither of the two i18n guards, plus translation corrections found while clicking through the logged-in interface (date range fields, self cost, faxes, action log, resellers, accountants).
v1.6.3
Released 2026-08-30
- i18n B8 part 2 (Statistics, JSX and non-JSX in one pass). Fixed: the default date range of every statistic started one day too early (toISOString applied to local midnight) and pulled calls from the previous month into every financial report; numbers, money, percentages, durations and dates now follow the selected language; the CSV header of the daily export was partly language-dependent and is now fixed, so the column names no longer change with the language; the profit PDF deliberately stays English, because pdfkit silently renders Cyrillic/Arabic/Turkish as blank.
v1.6.2
Released 2026-08-30
- i18n B8 part 1 (Monitoring + Alerts, JSX and non-JSX in one pass). Fixed: error messages from the monitoring forms never reached the user at all; the alert form showed raw codes (asr, hgc_absolute) instead of proper labels; the call tracing dialogs showed raw key names; alert validation sent German text through the URL; the number blacklist did not save the pool when the list type was set to white.
v1.6.1
Released 2026-08-29
- i18n C2: server actions now return keys instead of text, and t() is applied where those keys are read - this fixes the raw key names that were appearing in the interface.
v1.6.0
Released 2026-08-29
- i18n C1b: label tables at module scope have been switched over to keys (*_KEYS), and the proofreading pass that was still outstanding is now done.
v1.5.8
Released 2026-08-29
- i18n B7: Settings and Tools are now translated and the sidebar has been repaired (43 of its 107 labels had stayed English no matter which language was selected).
v1.5.4
Released 2026-08-29
- Multilingual B4: the Providers / LCR / Terminators / External DIDs / Number pools area is now fully translated (45 files, 449 strings, 10 languages). That completes bundle 1 (Calls + Devices + Providers): 1,185 findings translated, guard count 4,094 -> 2,909. In addition, date and time formats follow the selected language, and the tool that fills in the dictionaries now recognises English text even in legacy keys that have no English counterpart.
v1.5.1
Released 2026-08-29
- Multilingual B1: this stage adds translation support for client components (I18nProvider/useI18n), a client dictionary built from the real import graph, a JSX guard against hard-coded text, English as the source and default language, a system-wide default language you can set, and language codes that tolerate case and region (DE/de-DE); on top of that, 337 leftover escape sequences were cleaned out of the dictionaries.
v1.5.0
Released 2026-08-29
- White-labelling: the product name can now be changed per installation (Settings > Branding > Product name) - it takes effect in the browser title, the sidebar, the login page, the setup wizard and in emails; an empty field keeps the previous default. Also, the bundled email templates are now actually created (until now they were missing, which made the password reminder, the balance warning and the invoice and account statement emails fail), and they no longer carry the vendor's contact details; they use the company details configured on this system instead. Includes a database migration.
v1.4.16
Released 2026-08-29
- Fixed: building the country block lists was aborted after 5 minutes. With realistic lists it takes 15-25 minutes, and the time limit in the web service ended it before that. The consequence: countries that had not been processed yet stayed open even though the interface showed them as blocked, and the final step that saves the lists was never reached - after a restart, country blocking was gone completely until the nightly run rebuilt it. The build now runs without a time limit, survives a restart of the web services and logs errors instead of swallowing them. Existing installations: after the update, save the country selection once so that the lists are built in full and saved.
v1.4.15
Released 2026-08-28
- Security fix in the seed: no demo user is created any more. Until now every fresh installation got an additional end-customer account with a hard-coded default password that was reachable on the login page of every customer system. The block has simply been deleted from seed.ts; create test end-customers through the interface when you need them. This affects NEW installations only, because the seed is run by the installer and not by the update process. Existing installations: delete or disable that account once.
v1.4.14
Released 2026-08-10
- /calls: a new direction filter (All/Outgoing/Incoming/Internal) applies to the list, the summary tiles and the CSV export; the filter logic matches the Direction column exactly (OUT/IN/INT).
v1.4.12
Released 2026-08-10
- Fixed the update button: the update script now survives the web restart (double fork, PM2 treekill fix) and restarts the background service first and the web service last - during the v1.4.11 update from the GUI the background service stayed on the old code and the automatic reboot was skipped.
v1.4.11
Released 2026-08-10
- Fixed ghost calls on /calls/active: the create/hangup race on sub-second calls has been closed, and an automatic reconciler (CoreShowChannels, every 60 s) removes entries that no longer have a live Asterisk channel from the live view and from the licence counter; the AMI disconnect warning works again (close event).
v1.4.10
Released 2026-07-24
- SIP fix: devices behind the same public IP as a provider trunk were wrongly identified as that trunk - their registration failed with 404 Not Found and calls from such devices showed up as phantom inbound calls on the live page. The provider identify rule now matches the carrier's source IP AND signalling port instead of the bare IP, so devices behind NAT correctly fall through to username authentication. No database migration.
v1.4.9
Released 2026-07-11
- /calls: a new Provider column shows the provider the call finally ran over, and the direction is now shown as OUT/IN/INT (more compact); the detail page /calls/[id] now shows in its header the caller ID that was actually used.
v1.4.8
Released 2026-07-11
- Cause routing: a provider with no free pool caller ID is now skipped (it is never dialled with a fallback or device-name caller ID); in the From column, /calls now shows the caller ID that was actually used, and it marks skipped attempts.
v1.4.7
Released 2026-07-10
- Important correction to the caller ID selection: when every number in a pool is currently blocked (cooldown or quarantine), the system now hands out NO caller ID at all instead of reusing a blocked number. With "Same provider, new caller ID" the attempt is then skipped (the call moves on to the next provider, or fails cleanly) - the blocked number stays in cooldown and is not used again. Also, the call list is narrower (tighter column spacing, shorter Destination and Hangup columns, a compact attempts badge), so prices and the info button are visible without scrolling horizontally. No database migration.
v1.4.6
Released 2026-07-10
- Corrections to the call display: (1) Calls where the caller hangs up before the call is answered (cause 241) are now shown correctly as "NO ANSWER" instead of "FAILED" - including calls with retry/failover across several providers. (2) In the attempts group, an attempt the caller aborted (CANCEL) is shown as "NO ANSWER" with cause 241. (3) Long entries in the "Hangup cause" column are now shortened with an ellipsis ("..."), so the table is no longer too wide and you can see prices and info without scrolling (the full text is in the tooltip). (4) The values in the "Direction" column (Incoming/Outgoing/Internal) are now colour-coded, so you can tell them apart at a glance. No database migration.
v1.4.5
Released 2026-07-10
- The call list shows dial attempts at a glance: calls that had several dial attempts (retry / failover across several providers, or with a switched caller ID) now carry a badge in the new "Attempts" column (e.g. "2 attempts"). One click expands the attempts as a group right inside the list - with provider, caller ID, DIALSTATUS, Q.850 cause and the decision for each attempt - so you no longer have to open the detail page. There is also a new filter, "Only calls with several dial attempts". A display change only, no database migration.
v1.4.4
Released 2026-07-10
- Display fix on the call detail page: for failed calls with several dial attempts (cause routing/failover) the detail page showed the provider of the FIRST attempt instead of the last one - but the call had gone out over the last attempt (a failover provider, for example). For calls that were not answered, the detail page now shows the provider of the last dial attempt (from the attempts log). Answered calls were already correct. This is purely display logic - billing, stored data and the attempts panel are unchanged. No database migration.
v1.4.3
Released 2026-07-10
- Maintenance fix: the Asterisk sync script (sync-asterisk.ts) now reloads Asterisk over the AMI interface instead of through sudo calls - on target systems the app user has no passwordless sudo for asterisk -rx, so the reloads there had been failing SILENTLY (config files were written, but never loaded). To make that possible, the AMI client was extracted into a reusable core (ami-core.ts), and a parser race was fixed in which the AMI login event (FullyBooted) was wrongly treated as a failed response. No database migration, and no change in the behaviour of the web app.
v1.4.2
Released 2026-07-10
- Provider fix for several SIP accounts at the same carrier (same server IP): every additional provider with an identical IP now automatically registers and dials through its own stable SIP source port (5062, 5064, ... derived from the provider ID). Background: older provider softswitches (chan_sip) match a call to the SIP account by source IP and port - when two accounts arrived from the same port, one of them was wrongly rejected with 403 because the accounts could not be told apart. Providers with a unique IP stay on port 5060 as before; nothing changes for them. New installations open UDP 5062-5260 in the firewall for this; on existing installations you have to open it once by hand: ufw allow 5062:5260/udp. No database migration.
v1.4.1
Released 2026-07-10
- Billing fix for short calls: answered calls with less than 1 second of talk time (0.7 s, for example) were previously not charged at all, even though the provider bills them rounded up to 1 second. Such calls are now billed correctly, rounded up to the next whole second (1 s plus the price from the tariff); grace time is still taken into account. The billsec column still shows Asterisk's whole seconds (0 s); the real talk time is on the call detail page. The protection against double billing - one row and one charge per call - stays fully intact. No database migration.
v1.4.0
Released 2026-07-10
- The live call overview (Active calls) has been rebuilt from the ground up: the page now updates in real time without a reload - calls in progress and ringing calls appear and disappear immediately. Connected calls are listed at the top, ringing ones below; every column can be sorted ascending or descending with a click. New info tiles at the top show the number of active, connected and ringing calls. New filters for user, device, status, country, provider, DID, source and destination take effect immediately. A new column shows the IP address the device is placing the call from. Ringing calls show an animated orange phone, connected ones a pulsing green one. In the call list (Calls) there is a new Direction column (Incoming/Outgoing/Internal), and long texts such as the hangup cause are no longer cut off but shown in full. Includes a database migration (new column for the caller IP of the active calls).
v1.3.5
Released 2026-07-10
- Hangup causes are now correct and complete: hanging up before the call is answered is stored as 241 (instead of a blanket 127 for every failed call), no answer as 19, busy as 17; answered calls always show 16. Important billing fix: destinations without a rate in the user's tariff are now blocked with 203 instead of being connected FOR FREE. Blocked users can no longer place calls (201). DID rules now really take effect: only active DIDs accept calls (226 free / 229 reserved / 284 closed), the DID call limit is enforced (219), blocked DID owners reject the call (237), the DID blacklist reports 283. Provider skips (unreachable, limits, blacklists and whitelists, AGI reject) land in the CDR with their real reason (231/223/243/245/238/285/281/282/272/273/267), a PDD abort as 268, licence problems as 205/208. The call detail page now shows the hangup cause in plain text as well. No database migration.
v1.3.4
Released 2026-07-09
- Major update to intelligent failover routing: the caller ID pool now belongs to the DEVICE instead of to the cause rule - so on a retry or a provider switch, the caller ID always comes from the calling device's OWN pools (no mixing between devices or customers). A device can have several caller ID pools (new "CID pools" tab on the device); for each pool you can set which providers its numbers are valid for ("Valid for providers" in the number pool settings). There is a new cause rule action, "Next provider - new caller ID". On top of that, reputation and cooldown now apply to EVERY caller ID number, including customer numbers that are not in the system as a DID - and you can control them directly in the number list of a pool. Includes database migrations (applied automatically during the update).
v1.3.3
Released 2026-07-09
- Update reliability: fixed a fault in the update process where the service restart after installing a new version could fail with a "uv_cwd" message - the working directory was moved during the version switch, so PM2 could no longer start. The restart now runs reliably, and a genuine restart failure is reported honestly as an error instead of being passed over in silence. This affects the update mechanism only - no change to the application, no database migration.
v1.3.2
Released 2026-07-09
- DID reputation - a block now also takes effect for Quarantine, Retired and Blocked: numbers in these states are no longer drawn from the number pool as a caller ID (previously that only applied to cooldown). In addition, the number list of a pool (/number-pools/.../numbers) now shows the reputation status for each number - a red badge means currently not usable (cooldown/quarantine/retired/blocked), a yellow badge is a warning (overused or many rejects, but still usable). Application improvement only, no database migration.
v1.3.1
Released 2026-07-09
- Improvement to caller ID / DID reputation (cooldown): when a DID is released again after its cooldown has expired - automatically or with the "Release" button - it now goes to the back of the pool queue instead of being picked first again straight away under the "Least used" selection method. That way a number that has only just recovered is not immediately put back under heavy use. Application improvement only, no database migration.
v1.3.0
Released 2026-07-08
- New cause routing engine (optional, inactive by default): per provider or globally you can define rules that decide, based on the Q.850/SIP result and the call status, what happens after a failed call - next provider, another attempt with a different caller ID from a number pool, forwarding to an extension, or a deliberate hangup with a specific hangup code. Also new: an attempt history per call under call details, DID/caller ID reputation with automatic cooldown for overused or frequently rejected numbers, number pool selection strategies (least used / fewest rejects / skip cooldown) and a rule simulator for testing without risk. As long as no rules are configured, routing stays exactly as before. Includes database migrations (applied automatically during the update).
v1.2.1
Released 2026-07-08
- More compact admin layout: the device, provider and user forms now use two columns side by side with clear sections (heading plus divider) and the label next to the input field, so noticeably more settings are visible without scrolling, as in a classic telecom admin interface. The codec selection is now a compact grid, and page margins have been reduced system-wide. No functional changes, no database migration.
v1.2.0
Released 2026-07-08
- UI/design upgrade: the whole interface is more compact and more professional at 100% browser zoom (denser forms, tables and lists; up to 4 fields per row on wide screens). New: there are 5 colour themes (Light, Dark, Red, Blue, Navy Blue) in the palette menu in the header, plus your own logo (light/dark) and favicon under Settings > Branding - visible in the sidebar, on the login page and in the browser tab. No functional changes, no database migration.
v1.1.18
Released 2026-07-08
- Internal follow-up to the voicemail activation from v1.1.17: after an update the voicemail and dialplan configurations are now automatically reloaded and applied exactly once - previously this step ran on every restart of the background service, and the reload of the phone system could be skipped silently depending on the server permissions. Nothing changes in how you operate the system or in its features; no database migration.
v1.1.17
Released 2026-07-07
- Voicemail now really works: unanswered calls (no answer, busy, error/unreachable) automatically end up in the voicemail box of the device - for internal calls as well as for incoming calls through a DID. Voicemail is active by default for all devices, new and existing, and can be switched off per device under Devices > Voicemail. You listen to messages by dialling *97 from your own device. Previously the voicemail settings were saved but never reached the phone system, so they were display only.
v1.1.16
Released 2026-07-07
- Hangup causes are now stored with the real reason for blocked or rejected calls, instead of a generic entry: for example the destination or source on the blacklist or missing from the whitelist, insufficient balance, the device call limit reached, a duplicate call, a CPS or time limit, or no matching provider / no route. That way /calls and the statistics show the actual reason for the rejection. If a provider really was dialled and rejected the call, its genuine SIP/Q.850 cause is preserved.
v1.1.15
Released 2026-07-07
- /calls: when filtering by user you can now pick the device as well (the dropdown loads once a user has been chosen). You can choose how many rows the list shows (100/200/300/400/500 entries). The User and Device columns are always shown, including in the CSV export. The list of hangup causes has been greatly extended: alongside the standard Q.850 codes it now also covers the additional causes for blocked and failed calls (for example user blocked, no matching provider, insufficient balance, call limit reached, provider unreachable) - with the full description, in the statistics as well.
v1.1.14
Released 2026-07-07
- /calls now has search fields (date from/to, source, destination, status, hangup cause, user, provider) and a new Hangup cause column. On top of that, the real reason a call failed (the Q.850 hangup cause) is now stored correctly and shown with its full description - for calls that were never answered (busy, no answer, rejected) it previously read 0 everywhere. This applies to the statistics under /stats/hangup-causes as well.
v1.1.13
Released 2026-07-07
- Localization (location number rules, E.164) can now be selected directly in the device form (/devices) and in the provider form (/providers) - until now the assignment was only possible from the /localization page. For a provider the location sits on the linked provider device, just as in the legacy system.
v1.1.12
Released 2026-07-07
- Stability/logging: the background service now throttles AMI connection error logs (the same message at most once per minute, in compact form) - if Asterisk became unreachable for a while, the error log could otherwise grow unchecked to many GB and fill the disk. New installations additionally set up automatic log rotation (pm2-logrotate).
v1.1.11
Released 2026-07-07
- DID bulk management (/dids/bulk): user and device are now picked from dropdowns instead of you having to type the ID by hand. The device dropdown fills automatically with that user's devices once the user has been selected.
v1.1.10
Released 2026-06-25
- Asterisk TLS (WSS 8089 + SIP TLS 5061) now uses the real Let's Encrypt certificate instead of a self-signed one (a certbot deploy hook picks up every renewal automatically). Certificate renewal now also works while country blocking is active: port 80 (ACME challenge and redirect only) is exempt from the block - otherwise, blocking a country that the Let's Encrypt validation nodes sit in would stop the renewal -> after about 90 days all TLS, web and SIP alike, would have failed.
v1.1.9
Released 2026-06-20
- CRITICAL billing fix: customers were being charged twice for the same call. Local channel calls produced two CDR entries with the same uniqueid, and since v1.1.4 the user was charged on BOTH of them. Now there is exactly one calls row per call (deduplicated by uniqueid, the billable leg wins), and it is charged once.
v1.1.8
Released 2026-06-20
- Caller ID drawn from a number pool: the name part is now identical to the number that was drawn - the provider sees, for example, 41440000055 <41440000055> instead of 1000 <41440000055>. This applies to devices (CID engine) and to the provider trunk.
v1.1.7
Released 2026-06-20
- Provider registration: (1) the browser's autofill can no longer overwrite the password field (autocomplete=new-password) - it used to overwrite it, so saving the form stored a wrong password; (2) registration now heals itself after a transient rejection (auth_rejection_permanent=no) instead of staying Rejected for good.
v1.1.6
Released 2026-06-19
- Fixed: 'CallerID Random Number from Number Pool' (device mode 7) now saves the pool selection and the 'pseudorandom with deviation' setting - the mode silently fell back to Number/1 after saving. This is a web-only fix; providers were not affected.
v1.1.5
Released 2026-06-17
- Recordings fix: record=1 now records, not just record_forced, and the MixMonitor directory is writable at 2775. New: tariff rates have an 'Add country' function (country -> destination groups -> all destinations -> rate/increment per prefix, in bulk).
v1.1.4
Released 2026-06-17
- Real billsec: billing is now accurate to the second (25.956s is rounded up to 26s instead of being truncated to 25). The real_billsec and real_duration fields are now filled, and manager.conf carries timestampevents=yes.
v1.1.3
Released 2026-06-17
- A blocked country now blocks EVERYTHING (SSH and web too, not just SIP), and fail2ban is stricter (3 failed attempts instead of 5).
v1.1.2
Released 2026-06-16
- The PCAP/SIP ladder has been upgraded: the flow diagram and the message table (No./Time/Source/Destination/Protocol/Length/Info) now sit side by side, the cards use the full width, the diagram fills the width, and the table no longer has a scrollbar of its own. Fixed: the call log was empty after a reboot (logger.conf full => verbose(3), now reboot-proof; in the installer and in auto-heal).
v1.1.1
Released 2026-06-16
- Fixed: the caller ID now goes out to the provider correctly - from_user=login is no longer forced, which is what used to overwrite the CALLERID. New: the PCAP/SIP ladder is now recorded automatically for ALL calls and stored permanently - no manual recording needed.
v1.1.0
Released 2026-06-16
- Fixed: saving a provider or a device no longer throws an 'Application error'. The link from the web interface to Asterisk (PJSIP write permissions, the pjsip-reload wrapper and the includes) is now set up by the installer and healed automatically during an update (setup_asterisk_pjsip.sh).
v1.0.9
Released 2026-06-15
- Country blocking now survives a reboot (ipset persistence: a boot restore service puts the country sets back in place immediately).
v1.0.8
Released 2026-06-15
- There is a new whitelist for trusted IPs - they are never blocked by fail2ban or by country blocking, and they have their own page at /monitoring/whitelist - plus a server reboot button and an automatic reboot after an update in /settings.
v1.0.7
Released 2026-06-15
- Fixed: blocked countries now take effect immediately (the firewall/GeoIP trigger has the sudoers rights it needs), and the firewall is now built atomically, without a gap.
v1.0.6
Released 2026-06-14
- Fixed the blocked-countries list: blocked_countries is now filled in per country (on a fresh install no countries were shown at all).
v1.0.5
Released 2026-06-14
- Fixed the update mechanism (final): apply-update.sh used pnpm's built-in deploy instead of run deploy and backed up only the root .env (the apps/web|background and packages/db .env files plus ecosystem.config.cjs were lost during the swap). It now uses run deploy, keeps ALL install-specific files and installs the devDependencies. Includes the login robot (v1.0.2).
v1.0.4
Released 2026-06-14
- Fixed the update mechanism (part 2): apply-update.sh did not install the devDependencies (it inherited NODE_ENV=production from the web process) - prisma and the build were missing. The install step now runs with NODE_ENV=development. Includes the login robot (v1.0.2) and the update scripts (v1.0.3).
v1.0.3
Released 2026-06-14
- Fixed the update mechanism: apply-update.sh and rollback.sh were missing from the release tarball (the update button failed on fresh installs) - they now ship with it. Also includes the login robot (v1.0.2).
v1.0.2
Released 2026-06-14
- Login page: an interactive 3D robot now spans the whole page (it follows the mouse and reacts to a click or tap), on mobile as well; its position on the desktop has been improved.
v1.0.1
Released 2026-06-14
- Verified on a fresh install: PM2 binaries (next/dist and tsx/cli.cjs), a fix for TTY/non-interactive runs, the system seed with the currencies EUR/CHF/USD, servers DELETE+INSERT, monitoring (install_monitoring.sh: fail2ban for SIP, geoip and the security log), logrotate, SIP PCAP, port verification and certbot auto-renewal.
v1.0.0
Released 2026-06-12
- Initial release - Voiplix Billing System