SP Scott Peterman
Network systems engineering

I turn opaque networks into something you can query, plan around, and build against.

When a network's real state isn't queryable, your designs become shapes automation can't consume, and the tools you bought are the ones you can't extend. That's the gap I work in. Thirty years operating networks; the last five building the software that makes their state something you can trust.

OPERATE 30 yrs · MPLS · BGP · EVPN BUILD validated on real Arista · Juniper · Cisco DOMAIN datacenter · peering · service provider BASE Littleton, CO
How it's built

Every tool below was validated against real multi-vendor network OSes in a functional lab — real routing tables, real failure scenarios, run through automated suites and re-run on every change, not a one-time pass. Never just mock data. The constructs have since made their way into production, but the lab is where they were proven.

Lab-validated
Built against real network OSes with real routing state and real failures. The primitives used in these projects are re-usable constructs. Change the language, framework or pipeline.
Multi-vendor
Arista, Juniper, Cisco — on a shared, vendor-agnostic core.
QA-driven
Robot Framework + pyATS out of GitLab CI. Four years of it.
Inheritable
Reusable primitives on carefully chosen libraries — FastAPI, SQLite. Nothing obscure; the next engineer can pick it up.
Selected work

Four systems, built end to end.

This is not a product catalog. What they show is the approach to my solutions: the problem, the decision it turned on, and the thing running. Each one is a capability I can rebuild for a network that needs it. The first three are the Omega Network Suite: public, GPLv3, a no-server field kit for Linux, macOS and Windows. The fourth is a private build, shown here and walked through on request.

FIG.01
Map
Go core · C ABI
C++ · Qt 6
SSH + SNMP
Qt WebEngine

Discovery and topology mapping as a native application

Discovery engines get written into whatever app needs them, so the crawl can't be driven from a job runner, a CLI, or a second UI without being rewritten. And the map is usually a picture — not a document another tool can read.

The decision

Build the crawl engine once in Go, expose it across a narrow C ABI, and let a C++/Qt application and a headless CLI be two front ends over the same core — so discovery is a library, not a feature of one binary. SSH and SNMP collect side by side, with OIDs already validated against Junos, IOS and EOS. The map JSON schema is treated as a contract, because other tools consume it; the viewer is a separate, loosely coupled executable, and export and merge are first-class.

Native Qt discovery and topology mapping application.
live crawl → topology → export Go · C · C++ · Qt 6 · Linux, macOS, Windows open ↗
FIG.02
Connect
Go core · C ABI
C++ · Qt 6
SSH · telnet · serial
encrypted vault

A native terminal for engineers who live in PuTTY

Most network engineers are on Windows, and most of them are still in PuTTY — because nothing native replaced it. My own first attempt bundled the terminal, the mapper and the collector into one Go application, and it taught me the lesson the hard way: a terminal that also tries to be everything else does none of it well.

The decision

Split it. The terminal became a widget first and an application second, so the emulator is a reusable component rather than a feature of one binary. The application on top does one job: tabbed SSH, telnet and serial sessions that know their connection state, a session tree, an encrypted credential vault, and per-session logging — the same build on Linux, macOS and Windows. Mapping and capture moved into their own applications that share the map schema instead of the process.

Tabbed SSH sessions, session tree and credential vault in the native Qt terminal.
session tree → tabs → vault → logging Go · C · C++ · Qt 6 · Linux, macOS, Windows open ↗
FIG.03
Archive
Go core · C ABI
C++ · Qt 6
TextFSM · scoring
SQLite

Config and state archiving you can carry into a new network

On a new engagement, the first week goes to finding out what's actually running. Configs aren't collected, there's no history, and the ARP and MAC tables live on the screen of whoever last ran the command. A server-side archive is the right answer eventually — but you need the answer before anyone hands you a server.

The decision

A desktop archive in the CatTools tradition, read-only by design so it can be pointed at a network nobody has vouched for yet. It pulls configs and show output, keeps every version, and diffs what changed. ARP and MAC tables are parsed into searchable records by a template-scoring engine ported to Go — the output selects the template, not the engineer. Inventory comes straight from a mapping crawl, so the map feeds the archive with no retyping.

Config and show-output archive with version history and parsed ARP/MAC records.
capture → version → diff → parse Go · C · C++ · Qt 6 · Linux, macOS, Windows open ↗
FIG.04
Track
Python
SQLite
TextFSM
REST API

A searchable state-tracking machine for everything that isn't config

Config backup answers "what changed?" with a text diff, and only for config. Everything else the network knows — ARP, BGP, routes, LLDP, interfaces — is state you can't query, can't version, and can't trust.

The decision

Make any CLI output a first-class record. Define a template and it's collected, parsed, versioned, and semantically diffed — a peer dropping to Idle, not a timer ticking. Every parse is scored on records, fields, population and consistency, so the platform tells you whether its own data is even true, with a template lab for fixing the ones that aren't. All of it API-addressable, so it becomes the source of truth other automation reads.

Template lab scoring a parse against raw CLI output, with the parsed records beside it.
collect → parse → score → semantic diff Python · SQLite · TextFSM · self-hosted open ↗
One foundation

These aren't four tools — they're one set of reusable primitives applied four times. I'd rather everything spoke RESTCONF; operational reality is SSH-first, so parsing is the first-class citizen — the output selects the template, not the engineer. Underneath sits a hardened, vendor-agnostic SSH client and a structured artifact that carries the contract between stages. Each one is built to be a platform, not a script: something automation can consume reliably, and the next engineer can pick up and extend.

The real test of a primitive is whether it survives being pulled out and handed to someone else. The terminal core is a standalone Qt widget that owns no pty, with PySide6 wrappers, so a Python developer with no compiler and no Qt installed gets a native terminal in one pip install — I built it because I started out on Windows with no terminal options at all while writing automation tooling. The same Go core → C ABI → C++/Qt model carries all three public applications above: engine once, front ends many, shipping on Linux, macOS and Windows.

Where it started

The first two tools were Python, written at night in a hotel room during AutoCon 2. Secure Cartography maps a network over SNMP and SSH, jump hosts included, and is the ancestor of the mapping application above. Terminal Telemetry puts a live telemetry feed beside the SSH session, with user-built widgets and platform packs so any vendor can be added without code. Both were rebuilt from the ground up in 2026 and ship on PyPI. The Go predecessor to the Omega applications is still published as portable binaries for machines where you can't install anything.

Track record

Where it came from.

2024 — now
Principal Infrastructure Engineer
Datacenter and peering infrastructure on Arista and Juniper — circuit turn-ups, PNI implementations, and BGP peer migrations with pre-flight validation, state auditing, and cutover execution.
2022 — 2024
Principal Infrastructure Engineer · Columbia Sportswear
Enterprise network across 600+ retail locations, datacenters, and corporate sites (Cisco, Aruba, Palo Alto). Built a device-state collection platform for auditing and compliance.
2019 — 2022
Principal Engineer · Charter the QA instinct
Built datacenter QA network automation from the ground up — Robot Framework and pyATS suites against real hardware, out of GitLab CI on every config and image change. EVPN/VXLAN fabric and control/data-plane convergence validation. This is where "is the data even true?" became a habit.
2012 — 2019
Architect, IP Edge · Level3 / TW Telecom the gap seat
IP services architecture across a tier-1 backbone — MPLS L3VPN, VPLS, anycast DNS, NetFlow at carrier scale. Sat between engineering and automation, making sure the design constructs were built to be consumed by automation, a decade before that was the norm.
2006 — 2012
Architect III · Cricket / AT&T
Mobile carrier core — MPLS with OSPF-TE, VPLS, MVNO peering, datacenter fabrics up to ~300 switches.
Personal interest & contributions

AutiobooksQTa is a PyQt6 port of the Autiobooks project, built so a family member could turn his own writing into audiobooks. EPUB in, m4b out, voiced locally with Kokoro TTS and no cloud service involved. Published on PyPI.

Reference
Protocols
BGP · MPLS L3VPN
VPLS · EVPN/VXLAN
OSPF / IS-IS · SD-WAN
Platforms
Cisco IOS/XE/NX-OS
Arista EOS · Junos
Palo Alto · Aruba · F5
Languages
Python · Go · C/C++
C#/.NET · JS/TS
Qt 6 · PyQt6/PySide6
FastAPI · Fyne
Automation
pyATS · Robot Framework
Nornir · NAPALM · TextFSM
MCP · LLM tool calling
Paramiko · GitLab CI