Skip to content

Releases: sms1sis/WiFi-Config-Tuner

v7.2.1: emoji markers for module card profile tag

Choose a tag to compare

@sms1sis sms1sis released this 26 Aug 06:11

v7.2.1 — Emoji Markers for Module Card Profile Tag

WebUI / Module Card

  • Profile tag on the module card now includes an emoji marker — 📦 Stock, ⚖️ Balanced, ⚡ Performance, 🛠️ Custom — instead of plain Profile: X text, so the active profile is easier to spot at a glance in the Modules list.
  • sync_description()'s previous-tag stripping is now format-agnostic (matches any trailing [...] rather than the literal [Profile: ...] text), so re-syncing after this change still cleans up an old-format tag from a prior install without leaving both side by side.

v7.2.0: volume-key profile picker at install, module card status

Choose a tag to compare

@sms1sis sms1sis released this 26 Aug 06:02

v7.2.0 — Volume-Key Profile Picker & Module Card Status

New Features

  • Volume-key profile selection at install. customize.sh now prompts during install: Volume Down cycles Stock → Balanced → Performance, Volume Up confirms. Picking Balanced or Performance applies it immediately via the existing backend.sh apply_mode path (same snapshot/backup safety as applying from the WebUI) — no need to open the app just to get off Stock. Auto-continues at Stock after 15s of no input, and is skipped entirely (with a log line explaining why) when getevent, timeout, or /dev/input/event* aren't available to the install shell — a headless flash (fastboot/ADB sideload, or a manager that doesn't forward key events) never hangs waiting for a button that can't be pressed.
  • Current profile shown on the module card. module.prop's description is now kept in sync with the active profile — e.g. ... driver-aware. [Profile: Balanced] — visible in KernelSU/Magisk Manager's module list without opening the WebUI. New backend helper sync_description() (and a sync_description action for callers outside a WebUI action) reads the same saved mode get_mode does, so it can't disagree with what the app shows. Re-syncing is idempotent — a previous [Profile: ...] tag is stripped before the current one is appended, so repeated calls never nest tags.
  • apply_mode, apply_custom, and reapply_custom now sync the card automatically on every successful mode change, so the description reflects the live state without any extra step.
  • service.sh syncs the description on every boot, including for Stock and for a fresh install with no saved mode yet — module.prop is shipped fresh with every module update (the module dir is wiped on each flash, same as everything else under $MODDIR), so any previously-synced tag would otherwise disappear until the next mode change.

Notes

  • No changes to patch files or WCNSS_qcom_cfg.ini handling — this release is install UX and status visibility only.
  • The appended [Profile: ...] tag adds a bit of length to the description; if your manager app truncates long module descriptions, the tag may get clipped on-screen (v5.1.0 already trimmed the base text once for the same reason). Functionally harmless either way — this is a display-only concern.

v7.1.0: Snapshot History, Custom Profile Builder, Tools tab, new banner

Choose a tag to compare

@sms1sis sms1sis released this 21 Aug 09:17

v7.1.0 — Snapshot History & Custom Profile Builder

New Features

  • New "Tools" tab — added between Dashboard and Config in the bottom nav, dedicated to Snapshot History and the Custom Profile Builder (see below). Keeps the raw Config Editor page exactly as it was — a first pass had these panels appended to the Config page, but that pushed the raw .ini editor out of easy reach, so they got their own home instead.
  • Snapshot History & Rollback. Previously there was only a single stock backup slot (.bak), silently overwritten on first patch apply. Now every mode change creates a timestamped, labeled snapshot in /data/adb/wcs/snapshots/ (persistent, survives reflashes), listed newest-first on the Tools tab with one-tap Restore/Delete. Manual "Save" is also available for checkpointing before hand-editing the raw config. History is capped at 20 entries (oldest pruned automatically) so it never grows unbounded. Restoring a snapshot itself creates a safety snapshot of the pre-restore state first, so a rollback is always itself undoable. New backend actions: snapshot_create, snapshot_list, snapshot_restore, snapshot_delete.
  • Custom Profile Builder. A 4th profile alongside Performance / Balanced / Stock. Exposes 7 known WCNSS_qcom_cfg.ini keys (gEnableBmps, gEnableImps, gDataInactivityTimeout, TxPower2g, TxPower5g, gChannelBondingMode24GHz, gRoamScanOffloadEnabled) as individually toggleable sliders/switches on the Tools tab — friendlier than editing raw .ini text for users who just want to tune one or two values. Only the parameters you explicitly enable are written; everything else in the config is left exactly as the last-applied profile set it. The selection persists in /data/adb/wcs/custom.patch and is re-applied automatically on boot, the same as Perf/Balanced. New backend actions: apply_custom, get_custom_patch, reapply_custom (boot-only).
  • apply_mode now auto-snapshots before a real mode change (skipped when re-applying the same mode, to avoid noise), and apply_custom snapshots before every apply — each custom edit is its own checkpoint since, unlike Perf/Balanced, the values can differ between applies while staying in the same mode.
  • get_mode now recognizes custom as a valid saved mode (previously any value outside perf/balanced/stock silently fell back to stock).
  • service.sh re-applies a saved Custom profile on boot (reapply_custom), extending the existing Perf/Balanced boot-restore behaviour introduced in v7.0.0.

WebUI

  • Dashboard's Performance Profile row is now a 4-across grid (2×2 under 380px) to fit the new Custom button, which jumps straight to the Tools tab; existing Perf/Balanced/Stock buttons are unchanged.
  • Added a dedicated --purple accent (with -dim/-glow variants) across all three themes (Sci-Fi / Light / Dark) for Custom-mode styling, consistent with the existing green/amber/neutral treatment for Perf/Balanced/Stock.
  • Tools tab content (Snapshot History + Custom Profile Builder) refreshes on every visit rather than once per session, since either can change from actions taken on the Dashboard or Config page.

Assets

  • New banner.png. Replaced the leftover "Wi-Fi Config Switcher" title text (unchanged since the v7.0.0 rename) with "WiFi Config Tuner". Also swapped the small glyph above the chip icon for an unambiguous WiFi signal icon (dot + fanning arcs) — the previous glyph's rectangle-with-an-arc silhouette read as a padlock to more than one person. Subtitle updated to "GENERIC QUALCOMM EDITION // UNIVERSAL ROOT" to match the root-solution-agnostic wording used everywhere else since v7.0.0.

Rename to WiFi Config Tuner (v7.0.0) + maintenance audit

Choose a tag to compare

@sms1sis sms1sis released this 20 Aug 14:43

v7.0.0 — Rename & Maintenance Audit

Renamed

  • Project renamed: WiFi Config Switcher → WiFi Config Tuner. Module id changed from wifi_config_switcher to wifi_config_tuner (module.prop), which also updates the on-disk install path (/data/adb/modules/<id>/) and the WebUI's hardcoded actionScript path in lockstep — both were updated together since a mismatch here silently breaks every WebUI action. Display name, install banner, About page, and GitHub source links updated to match. The new name also resolves a naming inconsistency that predated this release: the WebUI <title> already said "Wi-Fi Config Tuner" while module.prop said "WiFi Config Switcher" — everything now agrees.
  • Breaking for existing installs: because the module id changed, flashing this version installs alongside any existing "WiFi Config Switcher" install rather than replacing it in place. See the README's "Upgrading" section — the old module must be removed manually via KernelSU Manager. Saved profile state in /data/adb/wcs/ is unaffected and carries over automatically.
  • update.json and module.prop's updateJson now point at the renamed WiFi-Config-Tuner repository.

Reliability & Portability

  • Removed non-POSIX local keyword (17 uses across detect_driver_type, get_driver_name, find_wifi_config, find_patch_dir, apply_patch). local is a bash/toybox/mksh extension, not POSIX sh — on ROMs whose /system/bin/sh doesn't support it, these variables would silently become global instead of raising an error, a dangerous failure mode. Replaced with per-function variable-name prefixes so correctness no longer depends on shell-specific behaviour.
  • Fix: apply_patch used a fixed /tmp/wcs_patch_count path for passing the applied-key count out of an awk subprocess — a race risk if apply_mode were ever triggered twice concurrently (e.g. a double-tap on the WebUI profile button before it disables itself). Now uses mktemp under the module's own state directory, with the temp file cleaned up immediately after use.
  • Removed dead code: the non-JSON get_debug_info action (~90 lines). The WebUI has only ever called get_debug_info_json; the plain-text twin was unreferenced and had already drifted slightly out of sync with it.
  • Removed dead code: legacy pre-v5.0.4 config-overlay path fallback in find_wifi_config(). MODDIR is wiped on every flash (see service.sh), so a module update always re-runs customize.sh fresh — there was no upgrade path left that could still hit this branch.

Internal Cleanup

  • Externalized the SoC-ID → Wi-Fi-chip-name table (~90 lines of hardcoded case statements) into a new chip_map.tsv data file, looked up via awk. Contributing a new SoC ID is now a one-line data edit instead of a shell patch. The SDM665/SD732G (SoC 394) disambiguation and the WCSS-address fallback stay in backend.sh since they need logic beyond a flat lookup.
  • Deduplicated the device-alias map (sunny→mojito, sweet_k/sweetin→sweet, willow→ginkgo) out of customize.sh and backend.sh into a single shared device_aliases.txt, read by both customize.sh (install time) and a new resolve_device_alias() helper in backend.sh (runtime sideload fallback). Previously the same map had to be updated by hand in two places.
  • Promoted the inline _esc() JSON-escaping helper out of get_driver_info into the top-level Helpers section, next to log_json().
  • detect_driver_type() is now a thin memoizing wrapper around the original detection logic (renamed _detect_driver_type_impl), guarding against any future code path calling it twice within the same action (it re-runs a zcat /proc/config.gz decompression each time). Does not cache across separate WebUI actions — each is its own fresh process.

WebUI Fixes

  • Fix: parseJson() used naive indexOf('{')/lastIndexOf('}') brace matching, which would silently grab the wrong substring if any JSON string value ever legitimately contained a literal { or } (e.g. an unescaped device-tree compatible string). Replaced with a proper depth-tracking scanner that respects quoted strings and escape sequences, so it finds the actual end of the intended object.
  • Google Fonts stylesheet now loads asynchronously (media="print" swapped to all on load, with a <noscript> fallback) instead of render-blocking. This is a Wi-Fi tuning tool — plausibly opened while the device's own connectivity is down or misconfigured — so first paint no longer waits on a network request that may never succeed. The existing monospace/sans-serif fallbacks in --mono/--head mean the UI stays fully legible either way.

Bug Fixes

  • Fix (critical): apply_patch corrupts values containing & or | — the old implementation used sed -i "s|...|${key}=${value}|" directly. Any value containing & expanded to the matched text in sed's replacement, silently writing wrong data. A | in the value broke the s|...| delimiter entirely. Current patch files only use integers so this was latent, but would have triggered the moment a patch added a string-typed value. Rewritten with awk — keys and values are passed as awk variables, never interpolated into a regex or replacement pattern.

  • Fix (critical): apply_patch inserts literal \n on Android (toybox sed bug) — when a key was new and the config contained an END marker, the old code used sed -i "s|^END|${key}=${value}\nEND|". Android's toybox sed does not support \n in replacements; it writes the two characters \n literally instead of a newline, producing a malformed config line. The awk rewrite handles END insertion with correct newline semantics on all POSIX shells.

  • Fix: apply_patch rewrites the whole file on every key — the old implementation ran one sed -i per key, rewriting the entire config file N times (23 times for sm6125). The awk rewrite makes a single pass over the file regardless of patch size.

  • Fix: apply_patch write is now atomic — the old implementation wrote directly to the config file. A kill mid-write (OOM killer, force-stop) left a truncated config the driver could not parse. The new implementation writes to a .wcs_tmp sibling and mvs it into place — mv on the same filesystem is atomic.

  • Fix: write_config (config editor save) is now atomic — same issue as above. The base64 decode now targets a .wcs_tmp file; mv replaces the live config only after a successful decode.

  • Fix: get_mode sanitizes mode file — cat mode_status.txt was written raw into a JSON string. A corrupt or manually edited file could produce invalid JSON, breaking the dashboard on next open. The value is now validated against the three known modes (perf, balanced, stock) and defaults to stock for anything else.

  • Fix: apply_mode ran detect_driver_type twice — once in the stock-restore branch and once after applying a patch, each triggering a full sysfs scan. Now runs once at the top of the action, result shared by both paths.

  • Fix: duplicate willow alias in customize.sh — two identical willow) ALIAS="ginkgo" entries in the device alias case block. Second entry was dead code but a maintenance hazard. Removed.

New Features

  • Boot-time profile re-application (service.sh) — after a module update or reflash, customize.sh copies a fresh unpatched config from /vendor into the overlay, silently reverting the tuning even though the saved mode still says perf or balanced. service.sh now reads the saved mode on every boot and re-applies it automatically. Output is logged to /data/adb/wcs/boot_restore.log for verification. Stock mode takes no action.

WebUI Fixes

  • Fix: theme flash (FOUC) on open — the saved theme was applied by JS after the page rendered, causing a brief Sci-Fi flash before switching to Light or Dark. A blocking inline <script> in <head> now reads localStorage and sets data-theme before the first paint. A visibility: hidden guard covers the remaining gap while the JS module loads. No visible flash at any network/CPU speed.

  • Fix: data-theme used empty string for Sci-Fi — setTheme('scifi') set data-theme="" (empty string). While functional, it means [data-theme] attribute selectors would match the empty value unexpectedly. All theme paths now use explicit string values ("scifi", "normal", "normal-dark"). :root and [data-theme="scifi"] are co-selectors for the Sci-Fi variables.

  • Fix: settings checkmarks hardcoded in HTML — check-scifi and check-interval-5 had ✔ baked into the HTML. If the user had changed those settings, reopening Settings briefly showed the wrong checkmark before JS corrected it. All checkmarks are now blank in HTML; JS always writes them via _syncThemeChecks / _syncIntervalChecks.

  • Fix: theme checkmarks not updated on Settings visit — navigate('settings') only called _syncIntervalChecks. If the theme was changed in the same session the checkmarks on the Settings page were stale until the page was re-visited. Now calls both sync functions on every visit.

  • Fix: deprecated escape()/unescape() removed — three decodeURIComponent(escape(atob(...))) calls and one btoa(unescape(encodeURIComponent(...))) replaced with TextDecoder / TextEncoder. The old functions are removed from the Web standard and log deprecation warnings in modern WebViews.

  • Fix: stats interval timer not cleaned up — setInterval for stats polling had no clearInterval on page unload. Added a pagehide listener to clean it up when the WebView is destroyed.

  • Removed dead .theme-toggle CSS — three rule blocks for .theme-toggle (a button replaced by the Settings page in an earlier version) were still in the stylesheet. Removed.

v6.2.0

Choose a tag to compare

@sms1sis sms1sis released this 01 Jun 04:11

What's Changed

This release focuses entirely on correctness and reliability — no new features except one important boot-time behavior fix. Several of these were silent bugs that could corrupt your Wi-Fi config under the right conditions.


🐛 Bug Fixes

Backend

  • apply_patch could silently corrupt config values — values containing & expanded to the matched text in sed's replacement pattern. Values containing | broke the s|...| delimiter entirely. Neither caused an error — the config was just written wrong. Rewritten with awk; keys and values are passed as variables and never touch a regex.

  • apply_patch wrote literal \n instead of a newline on Android — when inserting a new key before the END marker, the old sed -i "s|^END|key=val\nEND|" produced the two characters \n on Android's toybox sed (which doesn't support \n in replacements). The inserted line and END were merged into one malformed line. Fixed in the awk rewrite.

  • apply_patch rewrote the config file N times — one sed -i per key meant a 23-key patch (sm6125) rewrote the file 23 times. Now a single awk pass regardless of patch size.

  • apply_patch and write_config were not atomic — both wrote directly to the live config file. An OOM kill or force-stop mid-write left a truncated file the Wi-Fi driver couldn't parse. Both now write to a .wcs_tmp sibling and mv into place — atomic on the same filesystem.

  • get_mode could return malformed JSON — cat mode_status.txt was written raw into a JSON string with no validation. A corrupt or manually edited file would break the dashboard on next open. Now validated against the three known values; anything else returns stock.

  • detect_driver_type ran twice in apply_mode — once inside the stock-restore branch, again after applying a patch. Each call triggers a full sysfs scan. Now runs once at the top, result shared by both paths.

  • Duplicate willow alias in customize.sh — two identical willow) ALIAS="ginkgo" entries in the device alias table. Dead code, but a trap for anyone adding a willow-specific override later.

WebUI

  • Theme flash on open (FOUC) — every time the UI opened, it briefly flashed Sci-Fi before switching to your saved theme. The saved theme was applied by JS after the page had already rendered. Fixed with a blocking inline <script> in <head> that reads localStorage and sets data-theme before the first pixel is painted. A visibility: hidden guard covers the remaining gap while the JS module loads.

  • Deprecated escape()/unescape() in WebView — three decodeURIComponent(escape(atob(...))) and one btoa(unescape(encodeURIComponent(...))) were logging deprecation warnings in modern WebViews. Replaced with TextDecoder / TextEncoder.

  • Settings checkmarks showed wrong state on open — check-scifi and check-interval-5 had ✔ hardcoded in the HTML. If you'd changed those settings, reopening the Settings page briefly showed the wrong active option. All checkmarks are now blank in HTML; JS always writes the correct one.

  • Theme checkmarks stale after in-session theme change — navigate('settings') only synced the interval checkmarks, not the theme ones. Changing theme then visiting Settings showed the old checkmark until the page was re-visited. Fixed.

  • Stats interval timer leaked on WebView destroy — the setInterval for stats polling had no cleanup. Added a pagehide listener to clearInterval when the WebView is destroyed.

  • Dead .theme-toggle CSS — three rule blocks for a button removed several versions ago were still in the stylesheet. Removed.


✨ New Behavior

  • Profile survives module reflash — after flashing a module update, customize.sh copies a fresh unpatched config from /vendor into the overlay, silently reverting your tuning even though the saved mode still said perf or balanced. service.sh now re-applies the saved mode automatically on every boot. If you're on stock, nothing happens. Boot restore output is logged to /data/adb/wcs/boot_restore.log.

📋 Full Changelog

See changelog.md for the complete version history.

v6.1.4

Choose a tag to compare

@sms1sis sms1sis released this 22 Mar 19:29

What's Changed

🔍 Search & Replace in Config Editor

The config editor now has a full search and replace bar — making it practical to find and edit specific parameters in a 500+ line config file without scrolling manually.

How to use:

  • Tap the 🔍 icon in the top-right of the config panel header to open
  • Or press Ctrl+F / Cmd+F when on the Config page
  • Esc closes the bar

Find:
Type to search instantly. Match count shows as 1/12 in cyan, or no match in red. Use ▲ ▼ buttons or Enter / Shift+Enter to jump between matches. The selected match scrolls into view and is highlighted in the textarea automatically.

Replace:
The second row has a replace input with two actions — Replace replaces only the current match, All replaces every occurrence at once. Replace All reports the count in the status bar and system log.

Matching is case-insensitive. Special characters in the search query are escaped, so searching for gEnableBmps=0 or similar literal config strings always works correctly.


Full Changelog: v6.1.3...v6.1.4

v6.1.3

Choose a tag to compare

@sms1sis sms1sis released this 22 Mar 18:14

What's Changed

🐛 Bug Fixes

Debug dump === current connection === was always empty

The debug action was only calling dumpsys wifi for the current connection section, but cmd wifi status is the more reliable source on modern Android — it returns WifiInfo: cleanly without leading whitespace issues. Fixed by trying cmd wifi status first and only falling back to dumpsys if that fails. The section now correctly shows SSID, BSSID, RSSI, link speed, frequency, Wi-Fi standard, IP, and MAC.

wpa_cli signal_poll crashing on AOSP 16

AOSP 16 removed wpa_cli entirely. Every wpa_cli call in the backend now checks command -v wpa_cli first and prints wpa_cli not available on this ROM instead of a shell error. Affects the debug dump signal_poll section and the Method 3 stats fallback — both now degrade gracefully instead of producing garbage output.


Full Changelog: v6.1.2...v6.1.3

v6.1.0

Choose a tag to compare

@sms1sis sms1sis released this 22 Mar 15:37

What's Changed in v6.0.3 → v6.1.0

🔍 Driver & Chip Identification — Built From Scratch

The Driver button previously showed identical output on different devices because it only read kernel build flags. It now collects real hardware identity across every Qualcomm bus type.

New data collected:

  • PCI vendor:device ID — scanned from /sys/bus/pci/devices/, hardware-burned and unique per chip
  • SDIO/MMC modalias — covers SDIO-attached chips on older devices
  • Device-tree compatible string — searches of_node/compatible and known DT paths; falls back to scanning all DT nodes when only the platform glue (qcom,icnss) is found
  • SoC identity — reads /sys/devices/soc0/soc_id, machine, and family
  • BDF file — reads board data filename from /vendor/firmware/wlan/qca_cld/ or falls back to dmesg. Encodes chip + board variant (e.g. bdf_c3j.bin)
  • WCSS memory address — extracted from the icnss sysfs device path, used as secondary identifier when SoC ID has no match
  • Firmware version — queried from wpa_cli status with iw dev info as fallback
  • Hardware uevent — extracts PCI_ID, OF_COMPATIBLE, DRIVER from the device uevent file

Log output restructured — [CHIP] fields shown first and highlighted, [SOC] section in the middle, [DRV] evidence at the bottom. Identified chip name and BDF file light up green, unknown fields show in amber.


🗺️ Comprehensive Qualcomm SoC → Chip Lookup Table

SNOC/icnss devices have no PCI bus, so chip identity is resolved via SoC ID. The table grew from 12 entries to 50+ covering the full Qualcomm lineup:

Chip SoCs
WCN3620 MSM8916, MSM8936, MSM8939, MSM8952, MSM8996
WCN3615 MSM8937/SDM430, MSM8940, MSM8953/SDM450, SDM632
WCN3680B SDM630, SDM636, SDM660
WCN3990 SDM662, SDM665/Trinket, SDM675, SDM710, SDM712, SM6115/Bengal/Khaje, SM6125, SM6150, SM6225/SDM680, SM6350, QCS605
WCN3980 SDM845
WCN3998 SM7150, SM7150P, SM7225, SM8150
WCN6750 SM6375, SM7325/Yupik, SM7325P, SM7350
WCN6855 SM7450, SM7475, SM8250, SM8350, SM8475 (PCIe fallback)
WCN7850 SM7550, SM7675, SM8550, SM8550P, SM8650 (PCIe fallback)
WCN7851 SM8750/Sun (PCIe fallback)

Also includes four WCSS memory address fallbacks (c800000, 18800000, a000000, 18900000) for devices where even the SoC ID lookup has no match.

v6.1.0 also fixed two silent misidentification bugs — SoC IDs 415 and 457 appeared twice in the table. In shell case statements the first match wins silently, so SM8250 was being misidentified as SM8350, and SM6225 as SM8450. Both corrected.


⚙️ Settings Page

A full Settings page added to the bottom navigation bar:

  • Appearance — theme switcher (Sci-Fi / Light / Dark) moved here from the dashboard header. Dark is now the default theme
  • Stats Refresh Interval — 3s / 5s / 10s / 30s, persisted across sessions, takes effect immediately
  • Diagnostics — Copy Log and Export Debug Info buttons (copies to clipboard)
  • Advanced — Force Driver Reload and Reset Preferences

🐛 Bug Fixes & UI

  • Config editor was displaying raw base64 instead of decoded file content
  • Reboot banner warning icon is now red
  • Patch profile device name is now cyan, meta line full brightness
  • Nav bar height reduced — was oversized on small screens
  • Default theme changed to Dark

Full Changelog: v6.0.3...v6.1.0

v6.0.3

Choose a tag to compare

@sms1sis sms1sis released this 22 Mar 14:47

What's Changed

⚙️ Settings Page — Built From Scratch

The WebUI now has a fully functional Settings page accessible from the bottom navigation bar.

🎨 Appearance
Three themes now live in Settings instead of a small button tucked in the header — tap to switch instantly, preference saved across sessions:

  • Sci-Fi — dark navy, cyan neon, circuit board art
  • Light — white surfaces, Google-style palette
  • Dark — iOS-style dark grey (new default)

📡 Stats Refresh Interval
Choose how often link telemetry updates — 3s, 5s, 10s, or 30s. Takes effect immediately without a reload. Persisted across sessions.

🔬 Diagnostics

  • Copy Log — exports the full session log to clipboard as plain text
  • Export Debug Info — runs a full backend diagnostic and copies the result to clipboard, with live status feedback in the button subtitle

⚡ Advanced

  • Force Driver Reload — triggers a live kernel module reload directly from Settings
  • Reset Preferences — clears saved theme and interval, restores defaults instantly

🔍 Chip Identification — No More Identical Output

The Driver button in Utilities previously showed the same output on two completely different devices because it only read kernel build flags. It now collects hardware-burned chip identity, so every device produces a unique fingerprint.

Field Source
Chip name PCI ID lookup → WCN6855, QCA6390, QCA9377…
PCI vendor:device /sys/bus/pci/devices/ — hardware-burned
SDIO modalias /sys/bus/sdio/ and /sys/bus/mmc/ — covers older devices
Device-tree compatible of_node/compatible → e.g. qcom,wcn3990-wifi
Firmware version wpa_cli status with iw dev info fallback
Hardware uevent PCI_ID, OF_COMPATIBLE, DRIVER from device uevent

Chip name lights up green when identified, amber when unknown. Export Debug Info now opens with a full chip identification section — making it far more useful when reporting issues on new devices.


🐛 UI Fixes

  • Reboot banner warning icon is now red
  • Patch profile device name is now cyan, meta line full brightness — both were previously dimmed
  • Theme toggle button removed from dashboard header — lives in Settings now

Full Changelog: v6.0.1...v6.0.3

v6.0.0

Choose a tag to compare

@sms1sis sms1sis released this 22 Mar 10:14

v6.0.0 — Two-Page UI, Theme System & Config Editor

This is a major UI release. The WebUI has been rebuilt into a proper two-page app with a persistent bottom navigation bar, a three-theme system, and a built-in config file editor.


Two-Page Layout with Bottom Navigation

The single scrolling page has been replaced with two dedicated pages navigated via a bottom bar.

Dashboard — everything you need at a glance: system status, link telemetry, patch profile, performance profiles, utilities, and the log.

Config — a full-screen editor for WCNSS_qcom_cfg.ini, loaded directly from the active module overlay.

The bottom navigation bar features:

  • Large icons (28px) with text labels for easy tapping
  • Active page shown with a cyan top indicator pill + background glow (sci-fi theme)
  • Inactive tab clearly dimmed so the active one stands out
  • Config page loads lazily — only fetched on first visit, keeping startup fast

Built-in Config Editor

A full WCNSS_qcom_cfg.ini editor is now built into the WebUI. No more pulling the file manually over ADB to edit it.

Button Action
Reload Fetch the current live config from the device into the editor
Save & Apply Write your edits back to the module overlay, then auto-reload the driver (modular) or show the reboot banner (built-in)
Restore Restore the stock backup taken at install time

The editor is edge-to-edge on the Config page with the full panel frame visible on all sides — maximum writing space with clear boundaries.


Three-Theme System

Tap the button in the top-left corner of the Dashboard header to cycle through three themes:

Icon Theme Style
🎨 Sci-Fi Dark navy, cyan/green/amber neon, circuit board background, Orbitron font
🌙 Normal Light White/grey surfaces, Google-style blue/green palette, rounded cards, Inter font
🚀 Normal Dark iOS-style dark grey (#1c1c1e/#2c2c2e), system color palette, rounded cards, Inter font

Theme preference is saved to localStorage and automatically restored on every page load.


🔴 Bug Fix — Mode Resets to Stock After Reflash

Root cause: mode_status.txt was stored inside $MODDIR (/data/adb/modules/wifi_config_switcher/). KernelSU and Magisk wipe and recreate the module directory on every flash/update. After rebooting into the new module, the saved mode file was gone and the UI showed Stock even though Performance or Balanced had been applied.

Fix: Mode state is now stored at /data/adb/wcs/mode_status.txt — a persistent directory outside the module tree that is never touched by module installs or updates. The directory is created automatically on every backend invocation, so it self-heals on first run after a clean install.


Fix — Nav Icon Misalignment

SVG icons and text labels in the bottom nav were misaligned on some Android WebView versions. Fixed by:

  • Adding display: block to SVG elements (removes inline baseline quirks)
  • Wrapping text labels in <span> with display: block; line-height: 1
  • Adding explicit width/height attributes directly on SVG elements

Full Changelog: v5.1.2...v6.0.0