Network Scanner
Multi-stage network discovery and assessment tool with persistent baseline tracking.
Python · PostgreSQL · Linux · GitHub →
The problem
Small businesses rarely know what's actually on their network. A one-time scan tells you what's there today; it doesn't tell you what changed since last quarter, what's new and unexplained, or what services suddenly appeared on a host that shouldn't have them. Most off-the-shelf tools are either enterprise-priced or dump raw data without the context that makes findings actionable.
I wanted a tool built around the real workflow: scan, store, rescan, diff, report.
Architecture
The scanner is structured in stages, each writing to a PostgreSQL backend so results persist and can be compared across runs:
- Discovery — host enumeration across the target range
- Service identification — port and service detection on live hosts
- Enrichment — banner grabbing, version detection, OS fingerprinting
- Storage — normalized writes to
scanner_dbviadb.py, schema designed for diffability - Diff reporting — comparison between any two scan runs, surfacing new hosts, new services, removed assets, and version changes
The multi-stage design mirrors how multi-agent pentest frameworks decompose work — each stage has a focused job and writes structured output the next stage can consume.
Why PostgreSQL instead of flat files
Diff reporting is the feature, and diffing is a database problem. Flat JSON files force you to re-parse everything on every comparison and don't scale past a handful of scans. With a normalized schema, the diff between scan #4 and scan #11 is a query, not a script.
What's next
- Scheduled scan runner with email-delivered reports
- Severity scoring on diff entries
- Export formats for client-facing deliverables
What I learned
The architecture decisions that felt over-engineered early — separating stages, normalizing the schema, treating diff as a first-class output — are the ones that paid off. Building around the workflow instead of the scan itself changed what the tool actually is.