Releases: dr-dolomite/QManager
QManager BETA v0.1.15
π QManager BETA v0.1.15
Full rewrite of the install/update/uninstall pipeline β now filesystem-driven, crash-resilient, and curl-only. New password complexity rules with a live requirements checklist. Critical install-stability fixes: binary corruption, SSH drops on LAN installs, and spontaneous device reboots. Plus a security fix for the password reset tool and a correction to the About page's LAN info.
β¨ Improvements
Typography β Switched to Manrope
- Euclid Circular B replaced with Manrope across the entire frontend. The app now ships a single Google Fontsβsourced typeface (self-hosted at build time by
next/font/google, so the device still needs zero internet at runtime) instead of six local.woff2weights for Euclid. - ~200 KB smaller frontend tarball β the
qmanager-buildoutput dropped from ~6.5 MB β ~6.3 MB. Manrope's variable-font pipeline is more aggressively subsetted and compressed than the fixed Euclid weights we were shipping, and we're no longer bundling the italic cut we barely used. - Visual parity β Manrope is still a clean geometric sans in the same family as the previous design language (Vercel/Linear-adjacent), so no UI component needed tuning. Line heights, weights, and tracking all carry over.
- Reversible β the Euclid local-font block is left commented out in
app/layout.tsxso we can flip back without re-adding the imports if we decide to revisit the decision.
About Device β Correct LAN Info
- "LAN Gateway" replaced with "LAN Subnet" β The About page previously read LAN info from the modem via
AT+QMAP="LANIP", which reports the modem's internal USB/RNDIS pass-through subnet (default 192.168.224.x), not your actual OpenWRT LAN. Changing your LuCI LAN IP never updated the About page because those are two completely different networks. - Now sourced from OpenWRT UCI β
Device IPcomes fromuci get network.lan.ipaddr, andLAN Subnetis computed as<network_address>/<prefix>from the LAN netmask. Change your LAN to192.168.228.1/24and the About page immediately reflects192.168.228.1and192.168.228.0/24. - One fewer AT call per About page load β Dropping
AT+QMAP="LANIP"from the compound AT query reduces modem round-trips and removes a failure mode on pages that were previously gated on modem responsiveness.
Path: About Device (/about-device)
Password Validation β Complexity Rules and Live Requirements Checklist
- Minimum length reduced to 5 (from 6), but passwords must now include at least one uppercase letter, one lowercase letter, and one number. A 5-character
Abc12is demonstrably stronger than a 6-characterabcdefβ the rule change trades raw length for character-class coverage. - Live requirements checklist under the password field β both the onboarding password step and the change-password dialog now render a 4-item checklist that greys out (unmet) or turns success-green (met) in real time as the user types. No more guessing what "strong enough" means; the user sees every rule transition green before they can submit.
- Single source of truth β new
components/auth/password-requirements.tsxexports both thePasswordRequirementscomponent and anisPasswordValid()helper. Both frontend call sites useisPasswordValid()for their submit validators instead of duplicating regex checks inline. Future rule tweaks (e.g., adding a symbol requirement) change one file. - Backend parity β
auth/login.shandauth/password.shenforce the same rules server-side using POSIXgrepcharacter classes as defense-in-depth. Error code renamed frompassword_too_shorttopassword_weakwith the consolidated message"Password must be at least 5 characters and include uppercase, lowercase, and a number". - Existing passwords still work β the new rules only gate password creation (setup + change). Users with longer but weaker existing passwords (e.g., all lowercase) can still log in; they just can't pick one like that going forward.
- Onboarding Continue button is now gated on validity β during first-time setup, the "Continue" button on the password step stays disabled until every requirement in the live checklist is green and the confirmation field matches. No more clicking Continue only to hit a toast error; the button itself tells you you're not ready yet. The step reports its validity up to the wizard via an
onValidityChangecallback, which flows into the shell's existingcontinueDisabledprop.
Paths: Onboarding (first-time setup), System Settings β Change Password dialog
π§ Backend / Infrastructure
Install / Update / Uninstall Pipeline β Full Rewrite (v2)
All three scripts have been redesigned from the ground up to be filesystem-driven and crash-resilient.
- Filesystem-driven service management β
stop_services(),enable_services(), and the daemon kill loop now iterate$INITD_DIR/qmanager*and$BIN_DIR/qmanager_*instead of hardcoded service lists. Adding a new init.d service no longer requires updating install.sh in multiple places. The only remaining hardcoded list isUCI_GATED_SERVICES(4 user-controlled services:qmanager_watchcat,qmanager_tower_failover,qmanager_bandwidth,qmanager_dpi). - Two-phase VERSION write β
/etc/qmanager/VERSION.pendingis written at the start of install;/etc/qmanager/VERSIONis only updated after every step succeeds. If an install crashes mid-way, the old VERSION stays intact and VERSION.pending is a clear debugging breadcrumb. - build.sh auto-stamps VERSION from
package.jsonβ The build now reads the version once andsed-patches it into bothinstall.shanduninstall.shin the staged tarball. This fixes the v0.1.13 β v0.1.14 bug where the Updates page kept showing the old version after a successful OTA upgrade becauseinstall.shhad a stale hardcodedVERSION="v0.1.13"constant. - Atomic file installs β New
install_file()helper copies to a temp path, strips CRLF, chmods, and atomically renames into place. Eliminates "text file busy" half-writes when replacing running daemons and folds the old separatefix_line_endings/fix_permissionspasses into a single operation. - Interactive modem-detection prompt β If
detect_modem_firmware()cannot reach the modem on a fresh install, the script now promptsContinue installation anyway? [y/N]in interactive mode instead of dying outright. Non-interactive mode still fails fast unless--forceis passed. - Mandatory conflict removal β
remove_conflicts()(which opkg-removessms-tool,socat-at-bridge, andsocatβ packages that clobber/dev/smd11and collide with our bundledsms_tool) now runs on every install regardless of--skip-packages. Previously--skip-packagesalso skipped conflict removal, which could leave a broken AT stack even on a "successful" install. ethtoolis now required (was optional) β install hard-fails if ethtool can't be installed.qmanager_eth_link(ethernet link speed control) and several ethernet-touching paths depend on it; keeping it optional created a class of "works until you touch the ethernet card" bugs.- Post-install health check β After
start_services(), the installer now waits up to 10 seconds for/tmp/qmanager_status.jsonto be produced by the poller. A stronger signal than just checkingpidof qmanager_pollerβ verifies the poller is actually producing data, not just running. - AT stack verification β New
at_stack_check()step runsqcmd ATIup to 3 times at the very end of install (after services are up) to confirm the full AT pipeline (qcmd β atcli_smd11 β /dev/smd11) is working. On success, logs the modem model line (Quectel,RM551E-GL). On failure, prints a numbered troubleshooting list pointing at/dev/smd11permissions, directatcli_smd11 'AT'testing, package conflict checks, and the install log. Warn-only with retries so fresh hardware has a few seconds to settle before the check fires. - Structured install logging β Everything visible on screen is also mirrored to
/tmp/qmanager_install.logand/tmp/qmanager_uninstall.logwith timestamps and severity levels (INFO/WARN/ERROR). Log files are truncated at the start of each run, so they always reflect the most recent attempt. - New install.sh lint in build.sh β Build-time validation that the filesystem-iteration pattern is present, the main
qmanagerinit.d service exists, and everyUCI_GATED_SERVICESentry has a real file inscripts/etc/init.d/. Catches design regressions before the tarball is built. - Cleaner update.sh CGI contract β No frontend changes required. The Software Update page still talks to
update.shthe same way; the status JSON schema ({status, message, version, size}) is identical. OTA upgrades from v0.1.14 will work transparently.
curl-only HTTP Everywhere
- Dropped
wgetanduclient-fetchfallbacks across the entire backend. Previously, every script that fetched anything had a 3-way cascade (uclient-fetchβwgetβcurl) to support minimal OpenWRT installs. Sincecurlis now a required package (installed byinstall.shalongsidejqandcoreutils-timeout), the fallbacks were dead weight. - Affected scripts:
qmanager-installer.sh(bootstrap)scripts/usr/bin/qmanager_update(OTA daemon)scripts/usr/bin/qmanager_auto_update(cron-triggered updater)scripts/www/cgi-bin/quecmanager/system/update.sh(Updates page CGI)scripts/www/cgi-bin/quecmanager/device/about.sh(public IP fetch)
- Early failure with clear hint β Scripts that need curl now check for it up-front and print
Install it first: opkg update && opkg install curl ca-bundleif it's missing, instead of silently falling through to a dead fallback path.
Bootstrap Installer β Stable + Pre-release Channels
- New
--channelflag β `qma...
QManager BETA v0.1.14
π QManager BETA v0.1.14
SMS Alerts are here, so you can receive downtime notifications even when the data path is offline. Plus, Custom SIM Profiles now auto-apply when a matching SIM is inserted.
β¨ New Features
SMS Alerts
- Downtime SMS notifications β Receive an SMS when internet downtime exceeds your configured threshold.
- Outage-proof delivery path β Alerts are sent via
sms_toolover the modem control channel, so delivery still works while data connectivity is down. - Configurable behavior β Set recipient phone and threshold (1-60 minutes), then trigger a test SMS directly from the dashboard.
- SMS alert history β Sent and failed alert attempts are logged and displayed in the SMS Alerts log card.
Path: Monitoring -> SMS Alerts (/monitoring/sms-alerts)
IMEI Toolkit
For educational purposes only. Use at your own risk.
- Built-in IMEI generator β Generate valid 15-digit IMEI values from device TAC presets or a custom 8-12 digit prefix.
- Automatic Luhn validation β Validate typed or pasted IMEI values in real time once 15 digits are entered.
- Structure breakdown β Inspect TAC, SNR, and check digit fields directly in the toolkit for quick verification.
- Utility actions β Copy generated IMEI values and open external IMEI info lookup in one click.
Path: Cellular -> Settings -> IMEI Settings (/cellular/settings/imei-settings)
π§ Backend / Infrastructure
AT Command Backend β Migrated to atcli_smd11
- New AT backend β All AT command execution now goes through
atcli_smd11instead ofsms_tool. The new binary talks directly to/dev/smd11, is self-aware of long-command timeouts (e.g.AT+QSCAN=3,1,AT+QFOTADL), and produces clean output without thetcgetattr(...)/tcsetattr(...)diagnostics thatsms_toolemits on char devices. - Simpler
qcmdβ The gatekeeper script no longer needs dual timeout wrappers, the-t 240native-timeout flag, or per-command warm-up gymnastics. A single outer safety cap (timeout 300) guards against a wedged process;atcli_smd11handles the real timing. sms_toolis now SMS-only β Thesms_toolbinary still ships, but is reserved for SMS Center (recv/send/delete/status) and SMS Alerts. Every invocation now passes-d /dev/smd11explicitly and strips the tcgetattr/tcsetattr noise from its output before parsing, so the SMS inbox JSON, storage status, and test-SMS error messages are always clean.- Retired
sms_tool_devicesetting β The System Settings toggle to switch between/dev/smd11and/dev/smd7has been removed (both binaries are now device-locked). - Installer improvements β
install.shnow removes conflicting opkg packages (sms-tool,socat-at-bridge,socat) before installing, then copies bothatcli_smd11andsms_toolfrom the bundleddependencies/folder with 755 permissions. Thesms-toolopkg package is no longer a required dependency. - Shared
/dev/smd11lock β SMS Alerts and SMS Center now take the same/var/lock/qmanager.lockthatqcmd/atcli_smd11use, sosms_tool send/recv/delete/statusno longer race concurrent AT commands from the poller or watchdog on the char device.
Phone Number Normalization β Simplified
- One rule everywhere: omit the
+β SMS Alerts and SMS Center now share a single normalization rule: strip a leading+before handing the number tosms_tool. Nothing else. Inputs with or without+are accepted in the UI; storage insms_alerts.jsonis always raw digits. - Removed MCC-based local-number rewriting β
cellular/sms.shpreviously read the SIM's IMSI viaAT+CIMIand rewrote numbers starting with0to an international form using a 270-line MCC-to-country-code lookup table. That lookup, the IMSI read, and the auto-prefixing are all gone β users are responsible for providing the full international number. This cutscellular/sms.shfrom 478 lines to 266 and removes a per-send AT round-trip. - Migration-safe for existing installs β Legacy
sms_alerts.jsonfiles containing"recipient_phone": "+14155551234"still work.sms_alerts_initdoes an in-memory+strip at boot; the file is rewritten the next time you save settings.
Installation / Update Pipeline (So Far)
- Build staging auto-cleanup β
bun run packagenow removesqmanager-build/qmanager_installafter bothqmanager.tar.gzandsha256sum.txtare successfully generated, leaving only release artifacts. - Safer conflict removal order β Conflict package removal now prioritizes
sms-toolbeforesocat-at-bridgeandsocat, reducing opkg dependency-chain removal failures. - SSH-drop mitigation during upgrades β The install stop phase no longer stops
qmanager_eth_link, preventing an earlyethtoolrenegotiation that could briefly drop the management link/SSH session. - Direct release workflow adopted β Fresh install/uninstall docs now use direct latest pre-release tarball download + checksum verification +
install.sh/uninstall.shexecution. - One-liner wrapper restored β
qmanager-installer.shis now a thin bootstrap helper that runs the same direct tarball + checksum flow, but in a single command.
π Bug Fixes
Custom SIM Profiles β Auto-Apply on Matching SIM
- Profiles did not auto-apply on matching ICCID in key flows β A matching profile could be detected, but auto-apply was not consistently triggered across boot and SIM transition paths.
- Fix β Auto-apply now runs on boot, manual SIM slot switch, watchdog Tier 3 SIM failover, and watchdog SIM revert.
- Idempotent behavior β Existing per-step skip logic (APN/TTL/IMEI) ensures repeated triggers only apply differences and complete quickly when nothing changed.
- Concurrency-safe β Auto-apply respects the existing apply lock to avoid races with manual activation.
Sidebar Active-State in Cellular Navigation
- Cellular Information was highlighted on unrelated pages β The parent item stayed active across other Cellular routes, which also kept its sub-items expanded even when viewing a different section.
- Fix β Sidebar route matching now activates Cellular Information only for its own route and declared sub-routes, preventing false highlighting and incorrect submenu expansion.
APN Management Override with Active Custom Profile
- APN fields could override active profile settings β Users could still edit APN values while a Custom SIM Profile was active, creating conflicts with profile-managed APN behavior.
- Fix β APN form controls are now disabled whenever an active Custom SIM Profile is present, with an in-card notice showing profile ownership.
- Carrier Profile remains configurable β The Carrier Profile card stays editable so MBN selection and related carrier firmware controls are unchanged.
Device Metrics + Onboarding Band Source Hardening
- TA=0 showed misleading distance estimates β LTE/NR Cell Distance in Device Metrics could display very small estimated values (e.g.
< 10 m) when Timing Advance was0, even when that radio wasn't actively serving. - Fix β Device Metrics now treats LTE/NR TA value
0as unavailable and displays-instead of an estimated distance. - Temperature averaging included zero sensors β In edge cases,
AT+QTEMPsensor readings of0were included in the average, lowering the displayed modem temperature. - Fix β Temperature parsing now excludes all non-positive sensor values (
<= 0) before averaging. - Onboarding used hardcoded band catalogs β Band preference options in onboarding were based on static LTE/NR lists rather than modem capabilities.
- Fix β Onboarding now reads supported LTE/NSA/SA bands from the poller status JSON (
device.supported_*_bands) and uses those as the available selection set.
π₯ Installation
Fresh Install
curl -fsSL -o /tmp/qmanager-installer.sh https://raw.githubusercontent.com/dr-dolomite/QManager/development-home/qmanager-installer.sh && sh /tmp/qmanager-installer.shUpgrading from v0.1.13
Head to System Settings β Software Update and hit "Check for Updates" β download, verify, then install with the two-step flow.
Thank You
Thanks for using QManager! If you find it useful, consider supporting the project. Bug reports and feature requests are always welcome on GitHub Issues.
License: MIT + Commons Clause
Happy connecting!
QManager BETA v0.1.13
π QManager BETA v0.1.13
Custom SIM Profile reliability improvements β SIM mismatch detection, profile lifecycle events, and DPI boot persistence.
π Bug Fixes
π‘ Custom SIM Profiles β IMEI Apply Persistence
- π§ Profile showed "Inactive" after IMEI change + reboot β When a profile applied a new IMEI, the modem reboot (
AT+CFUN=1,1) could trigger a full system reboot on some USB configurations, killing the apply script before it could mark the profile as active. - β
Fix β The active profile marker is now written to flash immediately after a successful IMEI write (
AT+EGMR), before the modem reboot command is issued. If the system reboots during the modem reset, the profile is already marked active. Finalization still re-sets on success or clears on total failure.
π DPI Services Not Surviving Reboot
- π§ Video Optimizer and Traffic Masquerade settings didn't persist across reboots β The CGI save handlers set UCI config and restarted the service, but never called
/etc/init.d/qmanager_dpi enableto register for boot startup. - β Fix β Enabling either DPI feature now also enables the init.d service for boot. Disabling only removes boot persistence when both features are off. Uninstall always cleans up the boot symlink.
β¨ New Features
π‘ Custom Profile SIM Mismatch Detection
- π Auto-deactivation on SIM swap β When the device boots with a different SIM card, the poller now checks if the active profile's ICCID matches the current SIM. If there's a mismatch, the profile is automatically deactivated and a warning event is emitted. Profiles without a stored ICCID are left alone.
- π± SIM Mismatch badge β The profile table now shows a warning badge ("SIM Mismatch") instead of the blue "Active" badge when the active profile was created for a different SIM than the one currently inserted.
π Custom Profile Network Events
- π§© Profile lifecycle events β Profile apply, failure, and deactivation are now tracked in the Network Events system:
Profile Applied(β info /β οΈ warning for partial) β when a profile is successfully appliedProfile Failed(β error) β when all apply steps failProfile Deactivated(βΉοΈ info /β οΈ warning for SIM mismatch) β when a profile is manually or automatically deactivated
- π± Events appear in the Data Connection tab of the Network Events card
π₯ Installation
Fresh Install
wget -O /tmp/qmanager-installer.sh \
https://github.com/dr-dolomite/QManager/raw/refs/heads/development-home/qmanager-installer.sh && \
sh /tmp/qmanager-installer.shUpgrading from v0.1.12
Head to System Settings β Software Update and hit "Check for Updates" β download, verify, then install with the two-step flow.
π Thank You
Thanks for using QManager! If you find it useful, consider supporting the project. Bug reports and feature requests are always welcome on GitHub Issues.
License: MIT + Commons Clause
Happy connecting! π‘
QManager BETA v0.1.12
π QManager BETA v0.1.12
Antenna Alignment tool design refinement β improved color contrast for "Best" indicator.
π¨ Design Improvements
π‘ Antenna Alignment β Best Slot Indicator
- π§ "Best" badge and recommendation now use primary color instead of green β prevents visual confusion when all signal values are in the "Good/Excellent" range (also green). The primary color provides clear contrast against signal quality indicators.
- π§ "Best" badge z-index fix β The trophy badge on the recommended slot now renders above the card border instead of clipping behind it.
π₯ Installation
Fresh Install
wget -O /tmp/qmanager-installer.sh \
https://github.com/dr-dolomite/QManager/raw/refs/heads/development-home/qmanager-installer.sh && \
sh /tmp/qmanager-installer.shUpgrading from v0.1.11
Head to System Settings β Software Update and hit "Check for Updates" β download, verify, then install with the two-step flow.
π Thank You
Thanks for using QManager! If you find it useful, consider supporting the project. Bug reports and feature requests are always welcome on GitHub Issues.
License: MIT + Commons Clause
Happy connecting! π‘
QManager BETA v0.1.11
π QManager BETA v0.1.11
Antenna Alignment tool, Tailscale --accept-routes fix, and fresh install reliability improvements.
π Bug Fixes
π Tailscale Connect Used --accept-routes
- π§ Connecting to Tailscale disconnected the device from the network β The
tailscale upcommand still included--accept-routes, which overrides the device's routing table and kills all non-Tailscale connectivity. The connect action would always time out with "Timed out waiting for auth URL". - β
Fix: Replaced with
tailscale up --accept-dns=false --json. Also addedvpn_fw_ensure_zoneto the "already authenticated" reconnect path so the firewall zone is always applied.
π¦ Fresh Install Missing coreutils-timeout
- π§ All AT commands failed with
command_timeout(exit 127) βqcmdwraps everysms_toolcall intimeout, but some firmware builds don't include the BusyBoxtimeoutapplet. - β
Fix: Added
coreutils-timeouttoREQUIRED_PACKAGESin the installer script.
β¨ New Features & Enhancements
π‘ Antenna Alignment Tool
- π New Antenna Alignment page at Cellular β Antenna Alignment β Per-antenna signal strength (RSRP, RSRQ, SINR) for all 4 receiver chains (Main, Diversity, MIMO 3, MIMO 4), with automatic LTE/NR/EN-DC detection.
- π Alignment Meter β Record signal at 3 different angles (directional) or positions (omni), each averaged over 3 samples. A composite score (60% RSRP + 40% SINR) recommends the best position.
- π Live signal preview β Real-time RSRP and SINR bars for the primary antenna update with each modem poll cycle during recording.
- π― Directional / Omni toggle β Switch between angle-based (0Β°, 45Β°, 90Β°) and position-based (Position A, B, C) recording with custom labels.
π₯ Installation
Fresh Install
wget -O /tmp/qmanager-installer.sh \
https://github.com/dr-dolomite/QManager/raw/refs/heads/development-home/qmanager-installer.sh && \
sh /tmp/qmanager-installer.shUpgrading from v0.1.10
Head to System Settings β Software Update and hit "Check for Updates" β download, verify, then install with the two-step flow.
π Thank You
Thanks for using QManager! If you find it useful, consider supporting the project. Bug reports and feature requests are always welcome on GitHub Issues.
License: MIT + Commons Clause
Happy connecting! π‘
QManager BETA v0.1.10
π QManager BETA v0.1.10
NetBird VPN management, VPN inbound connectivity fix, Tailscale boot control fix, and improved uninstall process for both VPN clients.
π Bug Fixes
π VPN Inbound Connectivity (Tailscale & NetBird)
- π§ Peers could not reach the device via VPN β Both Tailscale and NetBird suffered from the same issue: the VPN interface (
tailscale0/wt0) was not assigned to any fw4 firewall zone, and mwan3 was hijacking VPN reply packets for WAN routing. - β
Fix: Two-part fix applied automatically on VPN install/connect/service start:
- Firewall zone β A UCI zone (
input=ACCEPT, output=ACCEPT, forward=ACCEPT) is created for the VPN interface with bidirectional forwarding to LAN. Persists across reboots. - mwan3 ipset exception β The CGNAT range
100.64.0.0/10is added to themwan3_connected_ipv4ipset so mwan3 skips marking VPN-bound traffic. Ephemeral (re-applied on every service start).
- Firewall zone β A UCI zone (
- π Shared helper library (
vpn_firewall.sh) ensures both fixes are applied/removed consistently across both VPN clients.
π Tailscale Boot Toggle Not Working
- π§ Disabling "Start on Boot" did not prevent Tailscale from reconnecting after reboot β The
luci-app-tailscaleinit script uses a UCIenabledflag as the authoritative control, not the init.d symlink. Additionally, a procd interface trigger firesreloadon every WAN up event, bypassing the symlink entirely. - β
Fix: The boot toggle now sets
tailscale.@tailscale[0].enabledin UCI config (the flag the init script actually checks), in addition to the init.d enable/disable.
β¨ New Features & Enhancements
π‘οΈ NetBird VPN Management
- π Full NetBird VPN management page at Monitoring β NetBird β Install, connect, disconnect, start/stop service, enable/disable on boot, and uninstall β all from the web UI.
- π Multi-state connection card β Adapts to show the appropriate UI for each state: not installed, service stopped, disconnected, and connected. Connected state shows FQDN, NetBird IP, Management status, and Signal status.
- π Optional setup key β Enter a setup key from the NetBird dashboard when connecting, or leave empty if already registered.
- π₯ Peers card β Shows connected peer details (hostname, IP, connection type, status, last seen) when available, or a summary peer count for older NetBird versions.
π VPN Mutual Exclusion
- π Only one VPN can be installed at a time β Installing Tailscale while NetBird is present (or vice versa) is blocked at the backend with a clear error message.
- π Cross-VPN awareness β Each VPN page detects if the other is installed and shows a prompt directing the user to uninstall it first.
ποΈ Improved VPN Uninstall Process
- π Uninstall section for both Tailscale and NetBird β Separated bottom section with confirmation dialog, following the established design pattern (Email Alerts, Video Optimizer).
- π§ Auto-stops service before removal β No need to manually stop the daemon first; the backend handles it automatically.
- π§ Firewall cleanup β VPN firewall zone and mwan3 ipset exception are removed on uninstall (only when the other VPN is also not installed).
- π Reboot after uninstall β A "Reboot Required" dialog appears after successful removal, offering "Reboot Now" or "Reboot Later" to clean up any remaining artifacts.
π₯ Installation
Fresh Install
wget -O /tmp/qmanager-installer.sh \
https://github.com/dr-dolomite/QManager/raw/refs/heads/development-home/qmanager-installer.sh && \
sh /tmp/qmanager-installer.shUpgrading from v0.1.9
Head to System Settings β Software Update and hit "Check for Updates" β download, verify, then install with the two-step flow.
π Thank You
Thanks for using QManager! If you find it useful, consider supporting the project. Bug reports and feature requests are always welcome on GitHub Issues.
License: MIT + Commons Clause
Happy connecting! π‘
QManager BETA v0.1.9
π QManager BETA v0.1.9
New per-antenna signal statistics page, Video Optimizer improvements, stability fixes for tower locking, poller crash prevention, and IPv6 display improvements.
π Bug Fixes
π MTU Reset During Tower Lock/Unlock
- π§ Custom MTU lost after locking or unlocking a tower β The modem briefly disconnects during tower lock/unlock operations, causing the RMNET driver to silently reset the interface MTU back to 1500. The persistent config file was intact, but nothing re-applied it after the interface bounced.
- β
Fix: Added
mtu_reapply_after_bounce()to the tower lock library. After any lock/unlock operation, a short-lived background process polls for the interface to recover (up to 30s), then re-applies the custom MTU from/etc/firewall.user.mtu. Self-terminates after re-apply or timeout. - π Integrated into all three code paths: CGI lock/unlock, failover daemon, and scheduled lock apply/clear.
- βΉοΈ Note: TTL/HL settings are unaffected (iptables mangle rules are global kernel state and survive interface resets).
π‘ Poller MIMO Read Crash Prevention
- π§ MIMO layer queries crash modem in wrong network mode β
AT+QNWCFG="lte_mimo_layers"causes errors in 5G SA mode, andAT+QNWCFG="nr5g_mimo_layers"causes errors in LTE/NSA mode. Previously, these were sent unconditionally and relied on "fails gracefully" β but errors in compound AT chains can abort subsequent commands. - β
Fix: MIMO read queries are now gated by
network_typein both boot-time Group B and Tier 2 polling. Enable commands (,1) remain unconditional since they are idempotent and safe in any mode.
π Ping Target Update
- π§ Default ping targets changed from IPs to hostnames β
8.8.8.8/1.1.1.1replaced withgoogle.com/cloudflare.comfor DNS-aware connectivity checks.
β¨ New Features & Enhancements
πΊ Video Optimizer β CDN Hostlist Import/Export
- π Import and export domain lists β The CDN Hostlist card now supports importing domains from
.txtfiles and exporting the current list. Imported domains are merged (duplicates skipped automatically). - π Default domain tracking β Backend now returns the factory default domain list alongside user domains. Custom (user-added) domains are visually distinguished from defaults in the UI.
- π Sorting β Toggle alphabetical sorting (AβZ / ZβA) or revert to original order via a kebab menu.
πΊ Video Optimizer β Faster Verification Test
- π§ Verification rewritten from speed test to packet counter β The old verify script ran a full 50 MB download with and without bypass to compare throughput (slow, ~20s+). The new approach reads the nftables packet counter before and after a single HTTPS request to a hostlisted domain β completes in seconds and directly confirms nfqws is intercepting traffic.
- β Results now show pass/fail with the tested domain and packet count instead of speed comparisons.
π¦ WebSocket (websocat) Now a Required Dependency
- π
websocatadded to required packages in the install script β previously it was an optional external binary that users had to install manually for the Bandwidth Monitor's live WebSocket streaming. Now installed automatically viaopkgduring install/update.
π‘ Antenna Statistics Page
- π New per-antenna signal metrics page at Cellular Information β Antenna Statistics β Displays RSRP, RSRQ, and SINR for each of the 4 receive chains (Main/PRX, Diversity/DRX, MIMO 3/RX2, MIMO 4/RX3), split into separate LTE and NR5G cards.
- π Animated progress bars with quality-tinted colors (green/yellow/red) for quick visual comparison across antenna ports.
- π Dynamic card ordering β The active technology card always renders first. If only NR5G is active (SA mode), the NR5G card takes the lead position. Empty technology cards show a clean empty state.
- π Quick access via the "Per-Antenna" link next to the Active MIMO row on the Cellular Information page.
- βΏ Accessible β Progress bars include full ARIA attributes (
role="progressbar",aria-valuenow,aria-label) for screen reader support.
π¨ UI Improvements
ποΈ Navigation Reorganization
- π§ Logs moved to System Settings β Previously a standalone page under Monitoring, now accessible at System Settings β Logs for a more logical grouping with other system-level tools.
- π§ Software Update moved to System Settings β Relocated from Monitoring to System Settings β Software Update, keeping all device management in one place.
- π§ Email Alerts moved under Network Events β Now accessible at Network Events β Email Alerts as a sub-item, since alerts are directly tied to network event monitoring.
π± IPv6 Address Display
- π§ IPv6 DNS and WAN addresses now display in proper compressed notation β The Cellular Information card previously showed raw Quectel dotted-decimal format (e.g.,
253.0.151.106.0.0.0.0.0.0.0.0.0.0.0.9) which overflowed on mobile. Now converts to RFC 5952 compressed form (e.g.,fd00:9b6a::9). A tooltip shows the raw value when the address was compressed.
π₯ Installation
Fresh Install
wget -O /tmp/qmanager-installer.sh \
https://github.com/dr-dolomite/QManager/raw/refs/heads/development-home/qmanager-installer.sh && \
sh /tmp/qmanager-installer.shUpgrading from v0.1.8
Head to System Settings β Software Update and hit "Check for Updates" β download, verify, then install with the two-step flow.
π Thank You
Thanks for using QManager! If you find it useful, consider supporting the project. Bug reports and feature requests are always welcome on GitHub Issues.
License: MIT + Commons Clause
Happy connecting! π‘
QManager BETA v0.1.8
π QManager BETA v0.1.8
DPI improvements, package management, and frontend quality polish across Video Optimizer, Traffic Masquerade, Tailscale, and Email Alerts.
π Bug Fixes
π‘οΈ Video Optimizer / Traffic Masquerade
- π§ nfqws install failing with "No compatible release found" β The installer used jq's
test()regex function, which silently fails on OpenWRT because jq is built without the oniguruma regex library. Replaced withendswith()which is always available. Also addedUser-Agentheader and HTTP status code reporting for better GitHub API error diagnostics. - π§ Install prompt text breaking to multiple lines β The
AlertDescriptioncomponent uses CSS grid, causing inline elements (<code>,<a>) to each render on their own row. Fixed by wrapping content in<p>tags. - π§ Traffic Masquerade card description had truncated sentence β "This sends fake Some carriers may detect..." was a leftover fragment. Cleaned up.
- π§ SNI domain input had dangling
aria-describedbyβ Referenced a non-existent element ID. Added properFieldDescriptionexplaining what the masquerade domain does.
β¨ New Features
π¦ Package Install & Uninstall Support
All optional dependencies now have in-app install and uninstall controls:
- π‘οΈ Video Optimizer / Traffic Masquerade β Install nfqws binary directly from zapret GitHub releases. Uninstall removes the binary and disables both features.
- π Tailscale β One-click
opkg installwith background progress polling. Uninstall removes packages and cleans up connection state. - π§ Email Alerts β One-click
opkg install msmtpwith progress feedback. Uninstall removes the package and generated config.
All three follow the same UX pattern:
- "Not installed" state shows both an Install button (automated) and a click-to-copy manual opkg command with an "or install manually" divider
- Install runs in the background with live status updates
- Uninstall requires the service to be disabled first, with an AlertDialog confirmation
- CDN Hostlist card is hidden when nfqws is not installed
π Live Stats Polling
- β‘ Video Optimizer and Traffic Masquerade service stats (uptime, packets processed, domains protected) now poll every 1 second while the service is running β no page refresh needed. Polling stops automatically on navigation.
π§ Email Alerts β msmtp Dependency Check
- π The Email Alerts settings card now checks if
msmtpis installed on the device and shows the "not installed" state with install options when missing, instead of silently allowing configuration of a non-functional feature.
π¨ UI & Quality Improvements
βΏ Accessibility
- π§ Added
aria-live="polite"regions to Video Optimizer and Traffic Masquerade cards for screen reader announcements on state changes - π§ Added
aria-labelto all click-to-copy command buttons - π§ Standardized error retry controls from raw
<button>elements to proper shadcnButtoncomponents with focus indicators and RefreshCcw icons - π§ Added
FieldDescriptionto Traffic Masquerade SNI domain input
π― Design Consistency
- π§ Fixed
ServiceStatusBadgeto use correctbg-success/15token (wasbg-success/10) per design system spec - π§ Standardized all icon sizing to Tailwind
size-*shorthand across audited components - π§ Added destructive styling to all uninstall confirmation dialog action buttons
- π§ Replaced
react-icons/tbdependency with lucideAlertTrianglein Video Optimizer and Traffic Masquerade cards
π§ Under the Hood
- π§© Extracted
CopyableCommandcomponent β Shared click-to-copy opkg command block with clipboard API + fallback (components/ui/copyable-command.tsx) - π§© Extracted
ServiceStatscomponent β Reusable stat tile grid used by both Video Optimizer and Traffic Masquerade (components/local-network/service-stats.tsx) - π Improved
qmanager_dpi_installdiagnostics β Logs HTTP status, GitHub API errors (rate limiting), and available release assets to/tmp/qmanager.log
π₯ Installation
Fresh Install
wget -O /tmp/qmanager-installer.sh \
https://github.com/dr-dolomite/QManager/raw/refs/heads/development-home/qmanager-installer.sh && \
sh /tmp/qmanager-installer.shUpgrading from v0.1.7
Head to System Settings β Software Update and hit "Check for Updates" β download, verify, then install with the two-step flow.
π Thank You
Thanks for using QManager! If you find it useful, consider supporting the project. Bug reports and feature requests are always welcome on GitHub Issues.
License: MIT
Happy connecting! π‘
QManager BETA v0.1.7
π QManager BETA v0.1.7
5G SA mode fixes β carrier aggregation, signal data, and neighbor cell scanning now work correctly on Standalone 5G.
π Bug Fixes
π‘ 5G SA Mode β Poller Data Loss
Fixed multiple issues where the status poller produced empty or incorrect data when the modem was connected in 5G SA mode. NSA and LTE-only modes were unaffected.
- π§ Empty APN, WAN IPs, and DNS in SA mode β The tier 2 compound AT command put LTE-specific queries (
lte_mimo_layers) before general network queries (CGCONTRDP,QMAP). In SA mode (no LTE), the LTE command errored and aborted the entire chain, preventing APN, IP addresses, DNS servers, NR timing advance, and NR MIMO from being collected. Split into 3 independent command groups so each can fail without affecting the others. - π§ SINR showing -327.7 on SCC carriers β The QCAINFO parser divided the raw SNR value by 100 without checking for the Quectel sentinel value -32768 (meaning "not measured"). Now correctly maps -32768 to
nullinstead of producing the bogus -327.7 dB. - π§ Carrier aggregation data intermittently empty β The compound
AT+QCAINFO=1;+QCAINFO;+QCAINFO=0was unreliable because the modem needs time between enabling and querying CA reporting. QCAINFO reporting is now enabled once at boot and queried directly each cycle β faster and fully reliable. - π§ QCAINFO promoted to Tier 1 β Carrier aggregation info (PCC/SCC bands, per-carrier signal strength, bandwidth) now updates every ~2 seconds alongside serving cell data, instead of every ~30 seconds.
π Neighbor Cell Scan β NR5G Field Misalignment
- π§ NR5G neighbor scan fields were shifted β The
nr5g_meas_inforesponse includes an enabled flag as the first field, but the parser read from field 1 instead of field 2. This caused PCI to show the ARFCN value, signal strength to show the PCI, and so on. All fields now correctly aligned.
π§ Under the Hood
- π§© Split tier 2 network queries β APN/IPs, NR timing+MIMO, and LTE timing+MIMO are now independent command groups. LTE errors in SA mode and NR errors in LTE-only mode no longer affect unrelated queries.
- β‘ Boot-time CA reporting enable β
AT+QCAINFO=1is sent once during boot data collection alongside MIMO/TA enables, eliminating the per-cycle enable/disable overhead. - π Updated debug script β
debug_poller_at.shnow mirrors the actual poller command structure for accurate diagnostics.
π₯ Installation
Fresh Install
wget -O /tmp/qmanager-installer.sh \
https://github.com/dr-dolomite/QManager/raw/refs/heads/development-home/qmanager-installer.sh && \
sh /tmp/qmanager-installer.shUpgrading from v0.1.6
Head to System Settings β Software Update and hit "Check for Updates" β download, verify, then install with the two-step flow.
π Thank You
Thanks for using QManager! If you find it useful, consider supporting the project. Bug reports and feature requests are always welcome on GitHub Issues.
License: MIT
Happy connecting! π‘
QManager BETA v0.1.6
π QManager BETA v0.1.6
Deep Packet Inspection tools, smarter updates, and UI polish β QManager gets serious about traffic shaping.
β¨ What's New
π‘ Video Optimizer (DPI) β β οΈ Experimental
A new Video Optimizer page under Local Network that uses nfqws to apply DPI desync techniques, helping bypass video throttling on cellular connections.
β οΈ Disclaimer: This feature is experimental and manipulates network packet behavior at a low level. Results vary by carrier and region. Use at your own risk and proceed with caution β disable immediately if you experience connectivity issues.
- π§ On-demand install β nfqws binary is downloaded from GitHub releases on first use (auto-detects device architecture)
- π― Hostlist-based filtering β only targets known video CDN domains (YouTube, Netflix, etc.) via a curated and editable hostname list
- π CDN Hostlist management β add/remove domains or restore the factory default list from a dedicated card
- π Live status β real-time uptime, packet count, and process status when active
- β Before/after verification β built-in speed test against Cloudflare to measure the impact
π Traffic Masquerade (DPI) β β οΈ Experimental
A companion feature on its own page that uses the same nfqws engine in a different mode β spoofing TLS ClientHello SNI headers to disguise all traffic as a trusted domain.
β οΈ Disclaimer: This feature is experimental and modifies outbound TLS handshakes. It may violate your carrier's terms of service. Use at your own risk and proceed with caution.
- π Configurable spoof domain β defaults to
speedtest.net, user-changeable - π Mutual exclusion β Video Optimizer and Traffic Masquerade share a single nfqws instance; enabling one automatically disables the other
- π§ͺ Test Injection card β verify masquerade is working with a built-in injection test
π¦ Software Update β Two-Step Flow
Updates are now a download-then-install process instead of a single blocking operation.
- β¬οΈ Download first β tarball is downloaded and SHA-256 verified before anything is installed
- β Staged install β green "SHA-256 Verified" badge confirms integrity; hit "Install" when ready
- π Survives navigation β staged downloads persist across page changes (detected on reload)
- π Progress bar β real-time download progress with accessible ARIA attributes
π¦ Software Update β Version Management
Replaces the old rollback system with a full version picker.
- π All releases listed β dropdown shows every GitHub release; current version is tagged, versions without assets are grayed out
- βͺ Rollback or reinstall β select an older version to rollback, or the current version to repair, each with a confirmation dialog
- π Current release notes β view the changelog for your installed version directly from the status card
π¨ UI & Design
- π·οΈ Consistent status badges β all status badges across the app now use
variant="outline"with semantic color classes and lucide icons (success, warning, destructive, info, muted) - π§Ή Form layout cleanup β improved spacing and alignment in Traffic Masquerade, MTU, TTL, and Video Optimizer settings cards
- π¨ Design token normalization β replaced hard-coded colors (emerald, blue) with semantic tokens (
text-success,bg-success/5, etc.)
π§ Under the Hood
π§Ή Installer & Update Improvements
- π Automatic legacy cleanup β during install or OTA update, the installer now scans the device for qmanager scripts that are no longer in the current package and removes them automatically. No more orphaned files from previous versions.
- π Permissions enforcement β every install/update now runs a comprehensive
chmodpass over ALL qmanager scripts on the device, ensuring correct permissions (755 for executables, 644 for libraries and data files) even for scripts from prior installs. - ποΈ Comprehensive uninstall β
uninstall.shnow dynamically scans for allqmanager*init.d services and binaries instead of relying on a hardcoded list. Also cleans up nfqws binary, nftables DPI rules, staged update files, and DPI-related runtime state.
π§© DPI Backend
- π§© DPI helper library β shared shell functions (
dpi_helper.sh) for nfqws management, nftables rules, and status reporting - βοΈ Init.d service β
qmanager_dpiprocd service manages a single nfqws instance in either Video Optimizer or Traffic Masquerade mode - π Kernel check β verifies
CONFIG_NETFILTER_NETLINK_QUEUEsupport in/proc/config.gzbefore attempting nfqws setup - π‘ Debug poller β added
debug_poller.shscript for dumping raw AT command responses during diagnostics
π₯ Installation
Fresh Install
wget -O /tmp/qmanager-installer.sh \
https://github.com/dr-dolomite/QManager/raw/refs/heads/development-home/qmanager-installer.sh && \
sh /tmp/qmanager-installer.shUpgrading from v0.1.5
Head to System Settings β Software Update and hit "Check for Updates" β download, verify, then install with the new two-step flow.
π Thank You
Thanks for using QManager! If you find it useful, consider supporting the project. Bug reports and feature requests are always welcome on GitHub Issues.
License: MIT
Happy connecting! π‘