WiFi Profile Inspector
A Windows CLI tool for inspecting WiFi profiles already saved on the local machine — authentication type, cipher, connection mode, and (only when explicitly requested) the stored key — presented through a Rich-powered terminal dashboard.
Built as a defensive-security / SOC-analyst portfolio project: clean architecture, full type hints, unit tests, and a strict local-only, opt-in-only design.
Disclaimer
This tool only reads WiFi profile data that Windows already stores
locally for the current user — the same data exposed by Windows'
own network settings UI and by running netsh wlan show profile
directly. It does not:
- connect to any network,
- target or scan remote hosts,
- escalate privilege,
- persist itself, evade detection, or exfiltrate data,
- or reveal any key without an explicit
--reveal-keysflag.
It is intended for personal use on machines you own or are authorized to administer, and for educational purposes (understanding how Windows stores WiFi profile data and how to build a clean CLI tool around it).
Features
- List every saved WiFi profile in a Rich table (SSID, authentication, cipher, connection mode, key presence, security level).
- Show full detail for a single profile, with keys hidden unless
--reveal-keysis passed. - Export all profiles to JSON, CSV, or TXT.
- Report view: profile table plus an aggregate security summary (open networks, weak/legacy authentication, stored-key count).
- Security classification (
open/weak/strong/unknown) computed per profile. - Structured logging, optional
--log-fileoutput. - Fully unit-tested parsing and export logic.
Screenshots
Add terminal screenshots here before publishing — e.g.
docs/screenshots/list-view.png,docs/screenshots/report-view.png
Architecture
See docs/architecture.md for the full layer
breakdown. Summary:
wifi-profile-inspector/
├── src/wifi_profile_inspector/
│ ├── cli.py # CLI entry point (installed as the `wifi-inspector` command)
│ ├── core/ # netsh execution, parsing, reports, export, logging
│ ├── models/ # WifiProfile dataclass, SecurityLevel enum
│ ├── ui/ # Rich banner, tables, panels, dashboard composition
│ └── utils/ # environment helpers, validators, status-tag colors
├── tests/ # unit tests (no Windows/netsh required)
└── reports/ # default export output directory
Installation
Requires Windows and Python 3.9+.
Install directly from PyPI — no cloning or cd-ing into the project
folder required:
pip install wifi-profile-inspector
This installs the wifi-inspector command onto your PATH, so it can
be run from any directory.
For local development instead
If you're working on the source itself rather than just using the tool, clone the repo and install it in editable mode:
git clone https://github.com/<your-username>/wifi-profile-inspector.git
cd wifi-profile-inspector
pip install -e .
Usage
Once installed, use the wifi-inspector command from anywhere:
# List all saved profiles
wifi-inspector list
# Show one profile (keys hidden by default)
wifi-inspector show "Home-WiFi"
# Show one profile with the stored key revealed
wifi-inspector show "Home-WiFi" --reveal-keys
# Export every profile to JSON (keys omitted by default)
wifi-inspector export --format json --output reports/profiles.json
# Export including revealed keys
wifi-inspector export --format csv --output reports/profiles.csv --reveal-keys
# Full dashboard + security summary
wifi-inspector report
# Verbose logging, persisted to a file
wifi-inspector list --verbose --log-file logs/run.log
Example output
$ wifi-inspector list
_ ___ _______ ____ _____ __
| | / (_) ____(_) / __ \_________ / __(_) /__
| | /| / / / /_ / / / /_/ / ___/ __ \/ /_/ / / _ \
| |/ |/ / / __/ / / / ____/ / / /_/ / __/ / / __/
|__/|__/_/_/ /_/ /_/ /_/ \____/_/ /_/_/\___/
v1.0.0 — Windows WiFi Profile Inspection Tool
╭───────── Session Information ──────────╮
│ User: ammar │
│ OS: Windows-11-10.0.22631 │
│ Python: 3.12.3 │
│ Timestamp: 2026-08-06 02:30:00 │
│ Profiles found: 3 │
╰──────────────────────────────────────────╯
────────────────────────────────────────────────────────────
Saved WiFi Profiles
┏━━━━━━━━━━━┳━━━━━━━━━━━━━━━┳━━━━━━━━┳━━━━━━━━━━━━┳━━━━━━━━━━┓
┃ SSID ┃ Authentication┃ Cipher ┃ Key Stored ┃ Security ┃
┡━━━━━━━━━━━╇━━━━━━━━━━━━━━━╇━━━━━━━━╇━━━━━━━━━━━━╇━━━━━━━━━━┩
│ Home-WiFi │ WPA2-Personal │ CCMP │ Yes │ STRONG │
│ CafeGuest │ Open │ None │ No │ OPEN │
└───────────┴───────────────┴────────┴────────────┴──────────┘
Export examples
JSON (--format json):
{
"generated_at": "2026-08-06T02:30:00+00:00",
"profile_count": 1,
"profiles": [
{
"ssid": "Home-WiFi",
"authentication": "WPA2-Personal",
"cipher": "CCMP",
"connection_mode": "Connect automatically",
"key_present": true,
"security_level": "strong"
}
]
}
CSV (--format csv): one row per profile, columns matching the
JSON keys above.
TXT (--format txt): a human-readable block per profile, suitable
for pasting into a report.
Running tests
git clone https://github.com/<your-username>/wifi-profile-inspector.git
cd wifi-profile-inspector
pip install -e .[dev]
python -m pytest tests/ -v
Tests exercise core/parser.py and core/exporter.py against fixed
sample text and temporary files — no Windows machine or real netsh
call is required, so they run in CI on any OS.
Project structure
wifi-profile-inspector/
├── pyproject.toml
├── README.md
├── LICENSE
├── CHANGELOG.md
├── CONTRIBUTING.md
├── .gitignore
├── src/
│ └── wifi_profile_inspector/
│ ├── __init__.py
│ ├── cli.py # entry point, installed as `wifi-inspector`
│ ├── core/
│ │ ├── wifi_manager.py # sole owner of subprocess/netsh calls
│ │ ├── parser.py # raw netsh text → WifiProfile
│ │ ├── report_generator.py # aggregate security statistics
│ │ ├── exporter.py # JSON / CSV / TXT export
│ │ └── logger.py # logging configuration
│ ├── models/
│ │ └── wifi_profile.py # WifiProfile dataclass, SecurityLevel enum
│ ├── ui/
│ │ ├── banner.py
│ │ ├── dashboard.py
│ │ ├── panels.py
│ │ ├── tables.py
│ │ ├── progress.py
│ │ └── theme.py
│ └── utils/
│ ├── helpers.py
│ ├── validators.py
│ └── colors.py
├── reports/
├── tests/
│ ├── test_parser.py
│ └── test_export.py
└── docs/
├── architecture.md
└── screenshots/
Publishing to PyPI
The project is already set up as an installable package (pyproject.toml,
src/ layout, wifi-inspector console script). To publish a new version:
pip install build twine
python -m build # creates dist/*.whl and dist/*.tar.gz
twine upload --repository testpypi dist/* # optional: try it on TestPyPI first
twine upload dist/* # publish to the real PyPI
You'll need a PyPI account and an API token (create one under
Account settings → API tokens, then use __token__ as the username
and the token as the password when twine prompts). Bump the
version field in pyproject.toml before every new upload — PyPI
does not allow re-uploading the same version number.
Future improvements
- Search and sort flags for the
listcommand (by SSID, security level, authentication type). - A
diffcommand comparing two exported reports over time. - Packaging as a standalone
.exevia PyInstaller for non-technical users. - Optional integration with a SIEM/log-forwarding pipeline for periodic WiFi posture snapshots.
License
MIT — see LICENSE.
Download files
Download the file for your platform. If you're not sure which to choose, learn more about installing packages.
Source Distribution
Built Distribution
Filter files by name, interpreter, ABI, and platform.
If you're not sure about the file name format, learn more about wheel file names.
Copy a direct link to the current filters
File details
Details for the file wifi_profile_inspector-1.0.0.tar.gz.
File metadata
- Download URL: wifi_profile_inspector-1.0.0.tar.gz
- Upload date:
- Size: 33.7 kB
- Tags: Source
- Uploaded using Trusted Publishing? No
- Uploaded via: twine/7.0.0 CPython/3.12.7
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
745dd99da227dd756f422b218547ff5487db0075559561cd0c88a46e12b993ce
|
|
| MD5 |
7c41a70f6322b24c1205c41af160f0b6
|
|
| BLAKE2b-256 |
cb75c0c783e19a8219715cb04540b96c6daa568f86d402d8caeeff6750cceea9
|
File details
Details for the file wifi_profile_inspector-1.0.0-py3-none-any.whl.
File metadata
- Download URL: wifi_profile_inspector-1.0.0-py3-none-any.whl
- Upload date:
- Size: 36.6 kB
- Tags: Python 3
- Uploaded using Trusted Publishing? No
- Uploaded via: twine/7.0.0 CPython/3.12.7
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
6c560c48ad55cdcd865805385b7073c473793ad7d65f92f36b7fdbe3e7390c50
|
|
| MD5 |
4e867f5cf54934bbe8708ae39c8ae0d4
|
|
| BLAKE2b-256 |
ae311e6d671d063ae3d30585e8a7b086d94dbd0c31a7ca619ef02a21f7e0f1db
|