Skip to content

Releases: dr-dolomite/QManager

QManager BETA v0.1.15

12 Apr 06:18

Choose a tag to compare

QManager BETA v0.1.15 Pre-release
Pre-release

πŸš€ 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 .woff2 weights for Euclid.
  • ~200 KB smaller frontend tarball β€” the qmanager-build output 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.tsx so 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 IP comes from uci get network.lan.ipaddr, and LAN Subnet is computed as <network_address>/<prefix> from the LAN netmask. Change your LAN to 192.168.228.1/24 and the About page immediately reflects 192.168.228.1 and 192.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 Abc12 is demonstrably stronger than a 6-character abcdef β€” 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.tsx exports both the PasswordRequirements component and an isPasswordValid() helper. Both frontend call sites use isPasswordValid() 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.sh and auth/password.sh enforce the same rules server-side using POSIX grep character classes as defense-in-depth. Error code renamed from password_too_short to password_weak with 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 onValidityChange callback, which flows into the shell's existing continueDisabled prop.

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 is UCI_GATED_SERVICES (4 user-controlled services: qmanager_watchcat, qmanager_tower_failover, qmanager_bandwidth, qmanager_dpi).
  • Two-phase VERSION write β€” /etc/qmanager/VERSION.pending is written at the start of install; /etc/qmanager/VERSION is 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 and sed-patches it into both install.sh and uninstall.sh in 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 because install.sh had a stale hardcoded VERSION="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 separate fix_line_endings / fix_permissions passes into a single operation.
  • Interactive modem-detection prompt β€” If detect_modem_firmware() cannot reach the modem on a fresh install, the script now prompts Continue installation anyway? [y/N] in interactive mode instead of dying outright. Non-interactive mode still fails fast unless --force is passed.
  • Mandatory conflict removal β€” remove_conflicts() (which opkg-removes sms-tool, socat-at-bridge, and socat β€” packages that clobber /dev/smd11 and collide with our bundled sms_tool) now runs on every install regardless of --skip-packages. Previously --skip-packages also skipped conflict removal, which could leave a broken AT stack even on a "successful" install.
  • ethtool is 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.json to be produced by the poller. A stronger signal than just checking pidof qmanager_poller β€” verifies the poller is actually producing data, not just running.
  • AT stack verification β€” New at_stack_check() step runs qcmd ATI up 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/smd11 permissions, direct atcli_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.log and /tmp/qmanager_uninstall.log with 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 qmanager init.d service exists, and every UCI_GATED_SERVICES entry has a real file in scripts/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.sh the 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 wget and uclient-fetch fallbacks across the entire backend. Previously, every script that fetched anything had a 3-way cascade (uclient-fetch β†’ wget β†’ curl) to support minimal OpenWRT installs. Since curl is now a required package (installed by install.sh alongside jq and coreutils-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-bundle if it's missing, instead of silently falling through to a dead fallback path.

Bootstrap Installer β€” Stable + Pre-release Channels

  • New --channel flag β€” `qma...
Read more

QManager BETA v0.1.14

11 Apr 04:29

Choose a tag to compare

QManager BETA v0.1.14 Pre-release
Pre-release

πŸš€ 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_tool over 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_smd11 instead of sms_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 the tcgetattr(...)/tcsetattr(...) diagnostics that sms_tool emits on char devices.
  • Simpler qcmd β€” The gatekeeper script no longer needs dual timeout wrappers, the -t 240 native-timeout flag, or per-command warm-up gymnastics. A single outer safety cap (timeout 300) guards against a wedged process; atcli_smd11 handles the real timing.
  • sms_tool is now SMS-only β€” The sms_tool binary still ships, but is reserved for SMS Center (recv/send/delete/status) and SMS Alerts. Every invocation now passes -d /dev/smd11 explicitly 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_device setting β€” The System Settings toggle to switch between /dev/smd11 and /dev/smd7 has been removed (both binaries are now device-locked).
  • Installer improvements β€” install.sh now removes conflicting opkg packages (sms-tool, socat-at-bridge, socat) before installing, then copies both atcli_smd11 and sms_tool from the bundled dependencies/ folder with 755 permissions. The sms-tool opkg package is no longer a required dependency.
  • Shared /dev/smd11 lock β€” SMS Alerts and SMS Center now take the same /var/lock/qmanager.lock that qcmd/atcli_smd11 use, so sms_tool send/recv/delete/status no 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 to sms_tool. Nothing else. Inputs with or without + are accepted in the UI; storage in sms_alerts.json is always raw digits.
  • Removed MCC-based local-number rewriting β€” cellular/sms.sh previously read the SIM's IMSI via AT+CIMI and rewrote numbers starting with 0 to 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 cuts cellular/sms.sh from 478 lines to 266 and removes a per-send AT round-trip.
  • Migration-safe for existing installs β€” Legacy sms_alerts.json files containing "recipient_phone": "+14155551234" still work. sms_alerts_init does 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 package now removes qmanager-build/qmanager_install after both qmanager.tar.gz and sha256sum.txt are successfully generated, leaving only release artifacts.
  • Safer conflict removal order β€” Conflict package removal now prioritizes sms-tool before socat-at-bridge and socat, reducing opkg dependency-chain removal failures.
  • SSH-drop mitigation during upgrades β€” The install stop phase no longer stops qmanager_eth_link, preventing an early ethtool renegotiation 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.sh execution.
  • One-liner wrapper restored β€” qmanager-installer.sh is 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 was 0, even when that radio wasn't actively serving.
  • Fix β€” Device Metrics now treats LTE/NR TA value 0 as unavailable and displays - instead of an estimated distance.
  • Temperature averaging included zero sensors β€” In edge cases, AT+QTEMP sensor readings of 0 were 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.sh

Upgrading 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

04 Apr 00:11

Choose a tag to compare

QManager BETA v0.1.13 Pre-release
Pre-release

πŸš€ 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 enable to 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 applied
    • Profile Failed (❌ error) β€” when all apply steps fail
    • Profile 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.sh

Upgrading 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

03 Apr 02:49
debe927

Choose a tag to compare

QManager BETA v0.1.12 Pre-release
Pre-release

πŸš€ 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.sh

Upgrading 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

03 Apr 02:26

Choose a tag to compare

QManager BETA v0.1.11 Pre-release
Pre-release

πŸš€ 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 up command 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 added vpn_fw_ensure_zone to 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) β€” qcmd wraps every sms_tool call in timeout, but some firmware builds don't include the BusyBox timeout applet.
  • βœ… Fix: Added coreutils-timeout to REQUIRED_PACKAGES in 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.sh

Upgrading 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

02 Apr 03:06

Choose a tag to compare

QManager BETA v0.1.10 Pre-release
Pre-release

πŸš€ 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:
    1. 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.
    2. mwan3 ipset exception β€” The CGNAT range 100.64.0.0/10 is added to the mwan3_connected_ipv4 ipset so mwan3 skips marking VPN-bound traffic. Ephemeral (re-applied on every service start).
  • πŸ”— 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-tailscale init script uses a UCI enabled flag as the authoritative control, not the init.d symlink. Additionally, a procd interface trigger fires reload on every WAN up event, bypassing the symlink entirely.
  • βœ… Fix: The boot toggle now sets tailscale.@tailscale[0].enabled in 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.sh

Upgrading 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

01 Apr 01:46

Choose a tag to compare

QManager BETA v0.1.9 Pre-release
Pre-release

πŸš€ 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, and AT+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_type in 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.1 replaced with google.com/cloudflare.com for 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 .txt files 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

  • πŸ†• websocat added 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 via opkg during 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.sh

Upgrading 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

29 Mar 07:33

Choose a tag to compare

QManager BETA v0.1.8 Pre-release
Pre-release

πŸš€ 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 with endswith() which is always available. Also added User-Agent header and HTTP status code reporting for better GitHub API error diagnostics.
  • πŸ”§ Install prompt text breaking to multiple lines β€” The AlertDescription component 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 proper FieldDescription explaining 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 install with background progress polling. Uninstall removes packages and cleans up connection state.
  • πŸ“§ Email Alerts β€” One-click opkg install msmtp with 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 msmtp is 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-label to all click-to-copy command buttons
  • πŸ”§ Standardized error retry controls from raw <button> elements to proper shadcn Button components with focus indicators and RefreshCcw icons
  • πŸ”§ Added FieldDescription to Traffic Masquerade SNI domain input

🎯 Design Consistency

  • πŸ”§ Fixed ServiceStatusBadge to use correct bg-success/15 token (was bg-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/tb dependency with lucide AlertTriangle in Video Optimizer and Traffic Masquerade cards

πŸ”§ Under the Hood

  • 🧩 Extracted CopyableCommand component β€” Shared click-to-copy opkg command block with clipboard API + fallback (components/ui/copyable-command.tsx)
  • 🧩 Extracted ServiceStats component β€” Reusable stat tile grid used by both Video Optimizer and Traffic Masquerade (components/local-network/service-stats.tsx)
  • πŸ” Improved qmanager_dpi_install diagnostics β€” 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.sh

Upgrading 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

28 Mar 03:57

Choose a tag to compare

QManager BETA v0.1.7 Pre-release
Pre-release

πŸš€ 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 null instead of producing the bogus -327.7 dB.
  • πŸ”§ Carrier aggregation data intermittently empty β€” The compound AT+QCAINFO=1;+QCAINFO;+QCAINFO=0 was 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_info response 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=1 is sent once during boot data collection alongside MIMO/TA enables, eliminating the per-cycle enable/disable overhead.
  • πŸ” Updated debug script β€” debug_poller_at.sh now 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.sh

Upgrading 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

28 Mar 02:29

Choose a tag to compare

QManager BETA v0.1.6 Pre-release
Pre-release

πŸš€ 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 chmod pass 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.sh now dynamically scans for all qmanager* 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_dpi procd service manages a single nfqws instance in either Video Optimizer or Traffic Masquerade mode
  • πŸ” Kernel check β€” verifies CONFIG_NETFILTER_NETLINK_QUEUE support in /proc/config.gz before attempting nfqws setup
  • πŸ“‘ Debug poller β€” added debug_poller.sh script 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.sh

Upgrading 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! πŸ“‘