Repository navigation
Releases: sms1sis/WiFi-Config-Tuner
Release list
v7.2.1: emoji markers for module card profile tag
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 plainProfile: Xtext, 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
v7.2.0 — Volume-Key Profile Picker & Module Card Status
New Features
- Volume-key profile selection at install.
customize.shnow prompts during install: Volume Down cycles Stock → Balanced → Performance, Volume Up confirms. Picking Balanced or Performance applies it immediately via the existingbackend.sh apply_modepath (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) whengetevent,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'sdescriptionis 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 helpersync_description()(and async_descriptionaction for callers outside a WebUI action) reads the same saved modeget_modedoes, 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, andreapply_customnow sync the card automatically on every successful mode change, so the description reflects the live state without any extra step.service.shsyncs the description on every boot, including for Stock and for a fresh install with no saved mode yet —module.propis 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.inihandling — 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
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
.inieditor 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.inikeys (gEnableBmps,gEnableImps,gDataInactivityTimeout,TxPower2g,TxPower5g,gChannelBondingMode24GHz,gRoamScanOffloadEnabled) as individually toggleable sliders/switches on the Tools tab — friendlier than editing raw.initext 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.patchand is re-applied automatically on boot, the same as Perf/Balanced. New backend actions:apply_custom,get_custom_patch,reapply_custom(boot-only). apply_modenow auto-snapshots before a real mode change (skipped when re-applying the same mode, to avoid noise), andapply_customsnapshots 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_modenow recognizescustomas a valid saved mode (previously any value outsideperf/balanced/stocksilently fell back tostock).service.shre-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
--purpleaccent (with-dim/-glowvariants) 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
v7.0.0 — Rename & Maintenance Audit
Renamed
- Project renamed: WiFi Config Switcher → WiFi Config Tuner. Module
idchanged fromwifi_config_switchertowifi_config_tuner(module.prop), which also updates the on-disk install path (/data/adb/modules/<id>/) and the WebUI's hardcodedactionScriptpath 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" whilemodule.propsaid "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.jsonandmodule.prop'supdateJsonnow point at the renamedWiFi-Config-Tunerrepository.
Reliability & Portability
- Removed non-POSIX
localkeyword (17 uses acrossdetect_driver_type,get_driver_name,find_wifi_config,find_patch_dir,apply_patch).localis a bash/toybox/mksh extension, not POSIXsh— on ROMs whose/system/bin/shdoesn'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_patchused a fixed/tmp/wcs_patch_countpath for passing the applied-key count out of anawksubprocess — a race risk ifapply_modewere ever triggered twice concurrently (e.g. a double-tap on the WebUI profile button before it disables itself). Now usesmktempunder the module's own state directory, with the temp file cleaned up immediately after use. - Removed dead code: the non-JSON
get_debug_infoaction (~90 lines). The WebUI has only ever calledget_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().MODDIRis wiped on every flash (seeservice.sh), so a module update always re-runscustomize.shfresh — 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
casestatements) into a newchip_map.tsvdata file, looked up viaawk. 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 inbackend.shsince they need logic beyond a flat lookup. - Deduplicated the device-alias map (
sunny→mojito,sweet_k/sweetin→sweet,willow→ginkgo) out ofcustomize.shandbackend.shinto a single shareddevice_aliases.txt, read by bothcustomize.sh(install time) and a newresolve_device_alias()helper inbackend.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 ofget_driver_infointo the top-level Helpers section, next tolog_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 azcat /proc/config.gzdecompression each time). Does not cache across separate WebUI actions — each is its own fresh process.
WebUI Fixes
- Fix:
parseJson()used naiveindexOf('{')/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 toallon 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 existingmonospace/sans-seriffallbacks in--mono/--headmean the UI stays fully legible either way.
Bug Fixes
-
Fix (critical):
apply_patchcorrupts values containing&or|— the old implementation usedsed -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 thes|...|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 withawk— keys and values are passed as awk variables, never interpolated into a regex or replacement pattern. -
Fix (critical):
apply_patchinserts literal\non Android (toyboxsedbug) — when a key was new and the config contained anENDmarker, the old code usedsed -i "s|^END|${key}=${value}\nEND|". Android's toyboxseddoes not support\nin replacements; it writes the two characters\nliterally instead of a newline, producing a malformed config line. Theawkrewrite handles END insertion with correct newline semantics on all POSIX shells. -
Fix:
apply_patchrewrites the whole file on every key — the old implementation ran onesed -iper key, rewriting the entire config file N times (23 times for sm6125). Theawkrewrite makes a single pass over the file regardless of patch size. -
Fix:
apply_patchwrite 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_tmpsibling andmvs it into place —mvon 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_tmpfile;mvreplaces the live config only after a successful decode. -
Fix:
get_modesanitizes mode file —cat mode_status.txtwas 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 tostockfor anything else. -
Fix:
apply_moderandetect_driver_typetwice — 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
willowalias incustomize.sh— two identicalwillow) ALIAS="ginkgo"entries in the device aliascaseblock. 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.shcopies a fresh unpatched config from/vendorinto the overlay, silently reverting the tuning even though the saved mode still saysperforbalanced.service.shnow reads the saved mode on every boot and re-applies it automatically. Output is logged to/data/adb/wcs/boot_restore.logfor 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 readslocalStorageand setsdata-themebefore the first paint. Avisibility: hiddenguard covers the remaining gap while the JS module loads. No visible flash at any network/CPU speed. -
Fix:
data-themeused empty string for Sci-Fi —setTheme('scifi')setdata-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").:rootand[data-theme="scifi"]are co-selectors for the Sci-Fi variables. -
Fix: settings checkmarks hardcoded in HTML —
check-scifiandcheck-interval-5had✔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 — threedecodeURIComponent(escape(atob(...)))calls and onebtoa(unescape(encodeURIComponent(...)))replaced withTextDecoder/TextEncoder. The old functions are removed from the Web standard and log deprecation warnings in modern WebViews. -
Fix: stats interval timer not cleaned up —
setIntervalfor stats polling had noclearIntervalon page unload. Added apagehidelistener to clean it up when the WebView is destroyed. -
Removed dead
.theme-toggleCSS — 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
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_patchcould silently corrupt config values — values containing&expanded to the matched text in sed's replacement pattern. Values containing|broke thes|...|delimiter entirely. Neither caused an error — the config was just written wrong. Rewritten withawk; keys and values are passed as variables and never touch a regex. -
apply_patchwrote literal\ninstead of a newline on Android — when inserting a new key before theENDmarker, the oldsed -i "s|^END|key=val\nEND|"produced the two characters\non Android's toybox sed (which doesn't support\nin replacements). The inserted line andENDwere merged into one malformed line. Fixed in the awk rewrite. -
apply_patchrewrote the config file N times — onesed -iper key meant a 23-key patch (sm6125) rewrote the file 23 times. Now a single awk pass regardless of patch size. -
apply_patchandwrite_configwere 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_tmpsibling andmvinto place — atomic on the same filesystem. -
get_modecould return malformed JSON —cat mode_status.txtwas 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 returnsstock. -
detect_driver_typeran twice inapply_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
willowalias incustomize.sh— two identicalwillow) 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 readslocalStorageand setsdata-themebefore the first pixel is painted. Avisibility: hiddenguard covers the remaining gap while the JS module loads. -
Deprecated
escape()/unescape()in WebView — threedecodeURIComponent(escape(atob(...)))and onebtoa(unescape(encodeURIComponent(...)))were logging deprecation warnings in modern WebViews. Replaced withTextDecoder/TextEncoder. -
Settings checkmarks showed wrong state on open —
check-scifiandcheck-interval-5had✔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
setIntervalfor stats polling had no cleanup. Added apagehidelistener toclearIntervalwhen the WebView is destroyed. -
Dead
.theme-toggleCSS — 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.shcopies a fresh unpatched config from/vendorinto the overlay, silently reverting your tuning even though the saved mode still saidperforbalanced.service.shnow 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
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
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
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/compatibleand 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, andfamily - 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 statuswithiw dev infoas fallback - Hardware uevent — extracts
PCI_ID,OF_COMPATIBLE,DRIVERfrom 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
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
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: blockto SVG elements (removes inline baseline quirks) - Wrapping text labels in
<span>withdisplay: block; line-height: 1 - Adding explicit
width/heightattributes directly on SVG elements
Full Changelog: v5.1.2...v6.0.0