VortexPanel v3.1.0 — WP Toolkit, firewalld, Performance #2
BrowserlessAPI
announced in
Announcements
Replies: 0 comments
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Uh oh!
There was an error while loading. Please reload this page.
-
VortexPanel v3.1.0 — WP Toolkit, firewalld, Performance
Release date: June 2026
This is a large release. The headline addition is the WP Toolkit — a full WordPress management module with a better UI than aaPanel's, built entirely free with no Pro tier required. There are also critical bug fixes that affected every fresh install via
install.sh.🔷 New: WP Toolkit
Full WordPress lifecycle management — install, manage, secure, stage, back up — without needing a separate plugin or paid add-on.
Install
wp-config.php, runs the installer, creates the vhost, sets file ownership, configures SSL, and enables system cron — all in one clickManage
user session create→ auto-login URL, no password needed)Security scanner
Staging
More
tar.gzof files + DB dump🔥 New: firewalld support (Fedora / RHEL / AlmaLinux / Rocky / Oracle / CentOS / CloudLinux)
The Firewall module previously only supported UFW (Debian/Ubuntu). Every RHEL-family distro uses firewalld, so the Firewall page showed inactive/empty and all actions silently no-op'd on those systems.
Now fully supported on both:
--list-ports,--list-services,--list-rich-rulesmerged into a unified numbered list;--add-portfor simple allow rules,--add-rich-rulefor deny/reject/source-restricted rules; presets (webserver, mailserver, database) via rich rules; toggle enable/disable viasystemctlAlso fixed on all distros: the frontend sent
protocolbut the backend readproto— UDP rules silently became TCP. Now fixed in both UFW and firewalld paths.🐛 Critical bug fixes
app.py— gunicorn entrypoint crash-loop on every fresh installapp = create_app()was only defined insideif __name__ == '__main__'. The systemd service created byinstall.shrunsgunicorn ... app:app, which imports the module — that block never executed. Every fresh install viainstall.shproduced a crash-looping service that would never start. Fixed by definingapp = create_app()at module level.Pages not loading after login (browser refresh required)
All page components (
x-data="websitesPage()"etc.) were initialised by Alpine.js at page load time — before login — so everyinit()hit 401 and stored empty data, which was never re-fetched after login. Addeddocument.addEventListener('vortex-logged-in', ...)to all 22 page componentinit()functions._onLoggedIn()already dispatched this event; now every page listens for it.Dashboard Disk card showing blank / wrong bar width
ramPct()anddiskPct()were called in the Dashboard template as methods but never defined indashboardPage(). Alpine threw a silent ReferenceError, leaving the Disk card value empty and the bar fill defaulting to nearly-full regardless of actual usage.dashboard/stats— 10× performance improvementReplaced
top -bn1(800–1500ms per request, waits for a CPU measurement cycle) with/proc/stat100ms sample. RAM, load, uptime, and network now read from/proc(instant). Services detection changed from 8 sequentialsystemctl is-activecalls to one batch call. Added 1.5s TTL cache. Total dashboard stats response: ~103ms (was ~1000ms).security.py— two 500 Internal Server ErrorsGET /api/security/modsecurity:sh()returns a 3-tuple in this file butrules_countwas assigned the whole tuple and passed toint()— TypeErrorPUT /api/security/loadbalancer: same issue — tuple assigned to variable then.lower()called on it — AttributeErrorLoad Balancer config corruption bug
The server-parsing regex also matched the virtual host's
server {block declaration, adding a phantom{address:'{'}upstream entry. On re-save this wroteserver { weight=1;into the nginx config before testing it — ifnginx -tfailed, the broken config stayed on disk. A future server restart would break nginx (all sites down). Fixed regex + made saves atomic (backup existing config, write new, test, rollback on failure).phpMyAdmin
php_versionsave always failingphpMyAdmin's PHP-version dropdown checked
/usr/bin/php{v}(CLI binary), but onlyphp{v}-fpmmay be installed — leaving the dropdown empty,currentPhp='', and Save always failing with "Config not found or PHP version missing". Fixed to check/run/php/php{v}-fpm.sockinstead.PHP 8.5 FPM socket permission denied (502 Bad Gateway)
php_install_script()inos_utils.pynever aligned new PHP-FPM poollisten.owner/listen.groupwith nginx's actual worker user. Package defaults (www-dataon Debian) didn't match a server running nginx as usernginx, causing 502 for every site on that PHP version. Fixed for both Debian and RHEL-family.phpMyAdmin link opening on localhost
Databases page button hardcoded
href="http://localhost:8082"— clicking from a browser opened port 8082 on the user's own machine, not the VPS. Fixed to uselocation.hostname.bandwidth.py— vnstat install broken on RHEL-family/api/bandwidth/install-vnstathardcodedapt-get install -y vnstat, non-functional on all RHEL-family distros. Fixed to usepkg_install()+ EPEL enablement.Roundcube PHP version switcher never worked
Frontend posted
{action:'set_php'}butsave_module_settings()had noset_phphandler — always returnedUnknown action. Added the missing handler.DDNS Manager Uninstall button
DDNS Manager's
checkcommand isecho found(it's a built-in feature). The Uninstall button ranapt-get remove ddclient(unrelated package) and the check still reported "found" — appearing as if uninstall silently failed. Addedbuiltin:Trueflag, threaded through the API, hidden the Uninstall button for built-in modules.Websites refactor (
websites.py1266-line → 8 modules)Split monolithic
websites.pyinto 8 focused modules. Addedensure_web_ownership()inwebsites_core.pyto fix wp-config.php write-permission failures on new site creation.⚡ Performance & UX
app.js150KB → ~40KB,index.html350KB → ~70KB over the wire/api/modulesresponse cached (30s TTL) — App Store page loads instantly on revisit; cache invalidated on install/uninstall.modal-overlayCSS class instead of inlineposition:fixed, which was getting trapped by Alpine's stacking contextUpgrading
Or fresh install:
wget -O install.sh https://raw.githubusercontent.com/BrowserlessAPI/VortexPanel/main/install.sh && bash install.shWhat's next (v3.2 roadmap)
This discussion was created from the release VortexPanel v3.1.0 — WP Toolkit, firewalld, Performance.
Beta Was this translation helpful? Give feedback.
All reactions