);
}
/* ── Edit-mode hook for tweaks panel ──────────────────────── */
function useEditMode() {
const [open, setOpen] = useState(false);
useEffect(() => {
function onMsg(e) {
const d = e.data || {};
if (d.type === "__activate_edit_mode") setOpen(true);
if (d.type === "__deactivate_edit_mode") setOpen(false);
}
window.addEventListener("message", onMsg);
window.parent.postMessage({ type: "__edit_mode_available" }, "*");
return () => window.removeEventListener("message", onMsg);
}, []);
return [open, setOpen];
}
function persist(key, value) {
window.parent.postMessage({ type: "__edit_mode_set_keys", edits: { [key]: value } }, "*");
}
/* Hero */
function PacketStream() {
return (
SPECTR · live capture · en0
REC1,770 pkts · 38 alerts
);
}
function Hero({ tagline, variant }) {
const t = TAGLINES[tagline] || TAGLINES.see_everything;
const copy =
<>
SPECTR 0.6.0 · NET INTEL 1.7.0 · MACOS · WINDOWS · LINUX
{t.pre}
{t.main} {t.tail}
{t.sub}
✓ 47 protocols · IT + IoT + OT + Wi-Fi✓ 34 anomaly rules · zero-latency✓ Local AI · air-gap compatible✓ Active throughput + perfSONAR drift correlation
>;
if (variant === "split") {
return (
{copy}
);
}
return (
{copy}
);
}
function ProductCaption() {
return (
Live capture
Crafted for microsecond detection. Composed for plain-English clarity.
The product, today. Live packet capture with the AI Analyst surfacing lateral movement, custom rules, and threats — in plain English, with the packets to back it up.
);
}
/* ProductSections */
function HowItWorks() {
return (
The flow
Install. Capture. Ask.
Three commands. No agents. No cloud. Yours, end to end.
01 / CAPTURE
Point it at an interface or a PCAP.
Reads live from tshark on macOS and Windows, or opens any PCAP/PCAPNG. Drag-and-drop supported. First-run setup checks dependencies and exits with a specific error if something's missing.
# live capture sudo spectr --iface en0
02 / DETECT
Rules fire on every frame. Zero latency.
Deep-parses 30+ protocols and evaluates a rule set across IT, IoT, and OT — unauthorized writes, lateral movement, DNS tunneling, SMBv1 negotiation, cross-domain flows, and more.
# tune per-environment spectr rules enableOT-W-*
03 / ASK
Plain-English diagnosis with packet citations.
Ask the analyst why is this PLC getting writes from an unknown IP? — get a specific answer referencing packet IDs, IPs, function codes, and a recommended action. Runs against Claude or a local Ollama model.
# local inference export INFERENCE_URL=http://localhost:11434/v1
);
}
function Coverage() {
return (
Coverage
Every domain. One capture.
Designed for environments that never sit still. IT, IoT, OT, and Wi-Fi — parsed in a single stream. The traffic that crosses domains is usually the traffic worth watching.
{DOMAINS.map((d) =>
{d.label}{d.count}
{d.name}
{d.desc}
{d.protos.map((p) => {p})}
)}
);
}
function AnomalyShowcase() {
return (
Detection
Specific findings. Not alert noise.
Crafted to cite the packet, the rule, the evidence. Every detection is inspectable. Every threshold is yours to tune.
Unveil the blast radius — before you have to explain it.
The Network Graph reconstructs every IP conversation in your capture as a live force-directed graph. A flagged host isn't a single line in a log — it's a hub with primary connections (who it talked to directly) and secondary connections (who those hosts talked to in turn). One click on an alert tells you exactly how far the problem reaches.
Alerts on the graph, not just the list.
Hosts tied to active anomalies render in red so the affected sub-graph is visible at a glance.
Primary vs. secondary relationships.
Direct neighbors are first-class edges; their downstream peers fan out as a second ring — the actual reachability footprint.
Blast radius is a number.
We count the unique hosts reachable from a flagged node through observed traffic — the same metric an IR team would compute by hand, but live.
Filter by domain, alert, or substring.
IT / IoT / OT pills, custom-alert overlay, IP-contains search. The same graph, scoped to the question you're asking.
Matched5
Blast radius55
Edges69
Packets2,139
Network GraphPingTracerouteDiagnose
ITIoTOTCustom alerts (1)
);
}
function DeepAnalysisFeature() {
return (
Featured · deep analysis
Ask once. Unveil everything — citation by citation.
Point SPECTR at a capture and ask it what's going on. The analyst reads the full session — flows, protocols, payload metadata — and returns a structured finding with the exact packet IDs, the risk, and a recommended action. No alert-list scrolling, no rule-ID decoding. Plain-English answers, packet-level evidence.
Concrete findings, never "suspicious activity."
Every finding names the protocol, the endpoints, the offending packets, and why it matters.
Tiered recommendations.
Immediate / short-term / policy — the same framing your IR runbook already uses.
Positive observations, not just red flags.
When the traffic is clean, the analyst says so — explicitly — and tells you what it ruled out.
Runs locally.
Same output against a local Ollama / LM Studio model. Your packets never leave the host.
SPECTR AI
claude · local
Capture web-egress.pcap9,412 pkts · 47.3 MB
UserAnything I should be worried about in this capture?
Based on my analysis of this capture, I can identify one notable security concern:
[WARNING]
Unencrypted HTTP/WebSocket Communication
What I observed
All traffic between 10.0.52.164 and external server 204.152.184.134 is occurring over port 80 (HTTP) rather than HTTPS
The session includes WebSocket communication (packets #9334, #9337, #9338, #9347) which is also unencrypted
Active web application session that concluded with a WebSocket close frame (#9347)
Security Risk
All data transmitted in this session is visible to any network observer
If this application handles sensitive data, credentials, or business information, it's completely exposed
WebSocket traffic often carries real-time application data — session tokens, business logic, personal info
Recommendation
Immediate: Verify what application is communicating with 204.152.184.134 and assess data sensitivity
Short-term: Migrate to HTTPS (port 443) and secure WebSockets (WSS)
Policy: Implement firewall rules to block outbound HTTP traffic and enforce HTTPS-only for web applications
Positive Security Observations
✓No active threats detected. No port scans, malware indicators, or attack patterns observed.
✓Clean traffic pattern. Normal TCP connection establishment, data exchange, and teardown.
✓No anomalies flagged. SPECTR's anomaly engine found no suspicious behavior.
Overall Assessment
Appears to be legitimate application traffic, but the use of unencrypted transport is a meaningful security gap worth closing before it carries production data.
Ask SPECTR about this capture…Send
);
}
function AIIntelligence() {
const caps = [
{ t: "Plain-English investigation", b: "Ask the analyst anything about a packet, a flow, or the last hour. Every answer names the IPs, cites the packet numbers, and ends with a recommended next move." },
{ t: "Natural-language packet search", b: "Skip the BPF. ‘Failed auth from the past hour.’ ‘Anything talking to a new external IP.’ The model writes the filter and applies it." },
{ t: "PCAP comparison", b: "Two captures, one diff. New devices, new protocols, behavioral drift — surfaced as a structured before/after report." },
{ t: "Per-device behavioral baseline", b: "Each device's normal — protocols, peers, rate envelopes — learned from observed traffic. Deviations show up where you're looking." },
{ t: "MITRE ATT&CK mapping", b: "Every finding carries a MITRE technique ID — Enterprise for IT, ICS for OT. Your SOC tooling already speaks this language." },
{ t: "JA3 / JA3S + JARM fingerprinting", b: "Every TLS handshake fingerprinted on the way in. Optional active JARM probes for C2 surface — admin-only, audit-logged, internal targets refused by default." },
{ t: "ICS-CERT / CISA correlation", b: "OT devices in the capture matched against a local CISA advisory database. Hits appear inline. No internet required." },
{ t: "Auto-summary on import", b: "Every PCAP that lands in the library — local, remote, or hand-carried — gets an AI summary in the background. Read the headline. Decide if it's worth a full investigation." }];
return (
The analyst
Designed to understand your network. Trained to explain it.
Orchestrated from behavioral truth, not statistical guesses. Every finding traces back to packets. Every model runs where you do.
Wireshark is powerful. A SIEM is generic. OT tools are siloed.
Crafted at the intersection. Packet-level depth. Real-time clarity. Every domain. One install.
{headers.map((h, i) =>
{h}
)}
{rows.map((r, i) =>
{r[0]}
{cell(r[1])}
{cell(r[2])}
{cell(r[3])}
{cell(r[4])}
)}
);
}
function Privacy() {
return (
Privacy by design
Your packets stay on your network.
Most packet analysis tools ship your capture to their cloud. SPECTR doesn't. The default inference path is a local model — Ollama, LM Studio, or SGLang — running on the same machine.
Air-gap compatible
Zero outbound requests when configured with a local backend. Suitable for isolated OT networks and classified environments.
Payload redaction before prompt
Optional privacy layer strips credentials, tokens, and payload contents from the AI context window. Headers and metadata only.
Pluggable backend
Swap between Anthropic API, OpenAI, Gemini, and local models by changing one env var. No vendor lock.
Orchestrated across IEC 62443, NERC CIP, NIST CSF 2.0, and NIS2. Delivered on your cadence. Audit-ready, every time.
{fw.map((f) =>
{f.k}
{f.d}
)}
);
}
function NetIntel() {
const caps = [
{ t: "5-vendor automation", b: "Cisco IOS / NX-OS, Arista EOS, Juniper JunOS, Fortinet. Forbidden-command regex + safe-command allowlist. AES-GCM credential vault — now covers SSH + SNMP v3 secrets." },
{ t: "5 transports · Pattern C hybrid", b: "SSH (Netmiko) · NETCONF (ncclient) · Serial console (pyserial) · RESTCONF (urllib) · SNMP v2c + v3 USM (HMAC-SHA1/256 + AES-128/256). New per-device state_transport decouples config and state channels — SSH for diff/drift, SNMP for high-resolution counters." },
{ t: "9 standard MIBs covered", b: "IF-MIB (HC 64-bit counters) · IP-MIB (ARP) · BRIDGE-MIB + Q-BRIDGE-MIB (MAC) · IP-FORWARD-MIB (routes) · LLDP-MIB (BFS picks up SNMP-only devices) · Q-BRIDGE-MIB (VLAN) · RSTP-MIB (STP) · ENTITY-MIB (SBOM). No vendor MIBs required." },
{ t: "Auto-discovery + vendor fingerprint", b: "CDP/LLDP recursive crawl with Purdue-zone guard. New SNMP fingerprint endpoint pulls sysDescr / sysName / sysObjectID and classifies Cisco / Juniper / Arista / Fortinet / HP / Dell / Mikrotik from the enterprise-OID prefix." },
{ t: "Config risk engine", b: "10 deterministic rules (SNMPv1, telnet, type-7, AAA gaps, ACL hygiene…) + optional LLM per-vendor analysis. Diff-aware findings auto-resolve when fixed. Encrypted-at-rest config snapshots (AES-GCM, reuses vault key)." },
{ t: "Agentic troubleshoot", b: "7 protocol playbooks: BGP, OSPF, STP, VLAN, IP, OT, DHCP. 4 tools, 8-iter cap. Native tool-use across Anthropic / OpenAI / Gemini; structured-JSON fallback for local models." },
{ t: "State discovery", b: "ARP / MAC / routes / BGP / OSPF / interface counters / VLAN / STP. Fleet-wide locators (“where is this MAC?”, “what's down?”) with longest-prefix-match routing." },
{ t: "CVE + SBOM", b: "Local NVD SQLite mirror (air-gap default). CycloneDX 1.4 + SPDX 2.3. SNMP-only devices now emit SBOM via ENTITY-MIB. Grey-market serial detection. Boot-image drift via source-scoped finding diff." },
{ t: "Topology + lifecycle", b: "Vendored Cytoscape map (3 layouts) with VLAN filter + STP overlay + 👑 root-bridge crown. Live flow overlays. Maintenance windows with pre/post safety snapshots. NERC CIP-010 PDF (deterministic SHA256 report-ID)." },
{ t: "JSONL transcript logger", b: "Per-session request/response transcript across SSH / NETCONF / serial / RESTCONF. Atomic 0o600 file create, tenant-prefixed filenames, configurable retention (default 24h sweep), per-session size cap." },
{ t: "Enterprise Devices grid", b: "Server-side filter / search / pagination. Bulk operations (200-device cap, no implicit cascade). Live /ws/netintel/devices WebSocket with online / stale / offline badges and row-pulse on events." },
{ t: "1,522 tests · air-gap verified", b: "Net Intel sub-suite passing. SNMP secrets never appear in audit / response / error / log fixtures. Same Ed25519-signed JWT licensing as core; license modal shows live node usage and renewal prompts." }];
return (
Network Intelligence · separately licensed · Net Intel 1.7.0
Designed to read the network. Engineered to change it.
Net Intel adds active infrastructure discovery to SPECTR Five transports (SSH · NETCONF · Serial · RESTCONF · SNMP v2c/v3) across five vendors, the new Pattern C hybrid (SSH for configs + SNMP for state), nine standard MIBs covered with zero vendor-MIB dependencies, deterministic risk rules, agentic troubleshooting, CVE correlation, and SBOM — same air-gap, multi-tenant, license-gated posture as core SPECTR.
{caps.map((c) =>
{c.t}
{c.b}
)}
);
}
function Throughput() {
const phases = [
{
stage: "iPerf3",
ver: "v0.5.3",
bg: "var(--accent-blue)",
tier: "Core SPECTR · Tools panel",
t: "Active throughput testing",
b: "New Throughput subtab next to Ping and Traceroute. TCP/UDP, reverse mode (download), 1–60s duration. Live canvas-rendered line chart of throughput-over-time. Color-coded summary cards: avg Mbps, retransmits, jitter, loss. Streaming text log for per-second forensic detail. Bundled iperf3 binary for macOS (Apple Silicon + Intel) and Windows; system $PATH fallback on Linux / Docker.",
meta: "WebSocket-streamed · 71 tests · SPECTR_IPERF3_PATH override"
},
{
stage: "B0",
ver: "v0.5.4",
bg: "var(--accent-green)",
tier: "Net Intel · SNMP fallback",
t: "SNMP utilisation overlay",
b: "Tier-0 fallback that needs no perfSONAR deployment. Green/amber/red colour band on every topology edge, computed from SNMP IF-MIB octet counter deltas (HC 64-bit preferred). Hover tooltip shows in/out percentages + absolute bps. Threshold bands at <50% / <80% / ≥80%; edges with insufficient data stay neutral.",
meta: "?include=utilisation · +37 tests"
},
{
stage: "B1",
ver: "v0.5.5",
bg: "var(--accent-cyan)",
tier: "Net Intel · perfSONAR clients",
t: "pScheduler + esmond REST clients",
b: "Stdlib-only urllib clients for perfSONAR's two REST APIs. Default OFF — quadruple env gate: ENABLED + PSCHEDULER_URL + ESMOND_URL + TRUSTED_HOSTS allowlist. Defense-in-depth PII redaction strips operator contact metadata from every response. URL allowlist re-checked at task-URL boundary. Optional bearer auth via API_KEY.",
meta: "Air-gap default · +73 tests"
},
{
stage: "B2",
ver: "v0.5.6",
bg: "var(--accent-cyan)",
tier: "Net Intel · perfSONAR overlay",
t: "Measured throughput on the topology map",
b: "Second \"perfSONAR\" toggle in the topology toolbar. Edges between registered testpoints paint by measured throughput / latency / loss from esmond's archive. Layers on top of B0: edges without perfSONAR data fall back to SNMP colour, so the operator always sees something. Hover shows \"perfSONAR: 942 Mbps · 1.23 ms · 0.01% loss\".",
meta: "?include=perfsonar · +24 tests"
},
{
stage: "B3",
ver: "v0.5.7",
bg: "var(--accent-purple)",
tier: "Net Intel · AI tools",
t: "Historical questions to the analyst",
b: "Agentic engine catalogue extends from 4 to 6 tools: query_perfsonar_latency and query_perfsonar_throughput. Ask \"what was latency between site A and B last Tuesday?\" or \"did congestion start after the config push?\" — the model picks the right tool, the right window, and answers in concrete numbers. Aggregate stats include count, avg, p50/p95/p99, max, min.",
meta: "Up to 168h window · +39 tests"
},
{
stage: "B4",
ver: "v0.5.8",
bg: "var(--accent-red)",
tier: "Net Intel · drift correlation",
t: "Strategic differentiator",
b: "When Net Intel detects config drift, the correlator automatically: reads pre-drift throughput + latency from esmond, schedules a fresh perfSONAR test on each affected path via pScheduler, polls until the run completes, re-reads esmond for post-drift, persists the before/after delta to the finding. The findings modal renders \"throughput: 1000.0 Mbps → 750.0 Mbps (Δ -25.0%)\" with green/red/muted colour coding past a 5% noise floor.",
meta: "+24 tests · 1,742 Net Intel total"
}];
return (
Throughput visibility · iPerf3 + perfSONAR
"Ping says good. The app feels bad." Now you can prove which.
Six features compose into a complete throughput-investigation workflow — from a one-shot iperf3 test in the Tools panel, to passive SNMP utilisation on the topology map, to perfSONAR-measured edges, AI-driven historical queries, and the differentiator: automatic before/after correlation when Net Intel detects config drift.
⚡ The differentiator
Config drift triggers a perfSONAR test. The delta is attached to the finding. When Net Intel sees a running-config change, the drift correlator auto-schedules a fresh throughput + latency measurement on every affected adjacency, then writes throughput: 1000 → 750 Mbps (Δ -25%) directly onto the drift finding. No other commercial network-monitoring tool does this. Air-gap safe; default off; opt-in via four env vars.
{phases.map((p, i) =>
{p.stage}{p.ver}
{p.tier}
{p.t}
{p.b}
{p.meta}
)}
An incident walks through every layer of the stack
perfSONAR overlay confirms it's not a counter-flap — same edge paints red on measured throughput. (B2 · active)
Operator asks the AI: "what was throughput last Tuesday?" Model calls query_perfsonar_throughput and answers. (B3 · historical)
Drift correlator already attached throughput: 1000 → 750 Mbps (Δ -25%) to the change-window finding. (B4 · automatic)
After the rollback, Tools → Throughput → one-shot iperf3 confirms the fix is live. (iPerf3 · verify)
);
}
function Enterprise() {
const items = [
{ t: "RBAC + audit log", b: "4 roles (superadmin / admin / analyst / viewer), JWT-gated REST + WebSocket, full audit trail. Opt-in — single-user mode stays simple." },
{ t: "Multi-tenancy", b: "Tenant-scoped users, rules, schedules, and agents. Superadmin role for cross-tenant visibility. Built for MSSPs and multi-site teams." },
{ t: "PCAP-over-IP remote agents", b: "Single-file standalone agent streams packets to a central server over an authenticated TCP channel. SHA256-hashed, tenant-scoped tokens." },
{ t: "Custom rule builder", b: "9 fields × 16 operators. Build, test, and ship anomaly rules from the UI — no Python required. Live hit-counter via WebSocket; per-rule recent-matches view." },
{ t: "Unified remote agent", b: "One spectr-agent binary. stream subcommand for live PCAP-over-IP; capture for time-boxed field collection with one-shot upload tokens. --save-only for air-gapped sites." },
{ t: "Docker Compose self-host", b: "Multi-stage Dockerfile (non-root, tini PID 1, /data volume, EXPOSE 8765) + compose.yml with /api/auth/config healthcheck. Optional nginx TLS-termination block. SQLite + WAL backend; Litestream-ready." },
{ t: "AI chat history", b: "Server-side persistence, tenant + user scoped, date-bucketed drawer. Resume any conversation. 90-day retention by default; opt-out via env." },
{ t: "Hardened CORS + WS reconnect", b: "v0.4.7 audit closes the wildcard-CORS-with-credentials CSRF amplifier; WebSocket reconnect honours close codes (4401 auth / 4402 license / 4403 forbidden) and the 5-retry give-up. Capture state broadcasts authoritative running / last_error after every start/stop." },
{ t: "Encrypted config snapshots", b: "AES-GCM at rest, reuses the credential vault key. Lazy decrypt with per-instance cache. SHA256 of plaintext keeps drift dedup unchanged. Superadmin migration endpoint for legacy rows. Vault-status banner re-arms on key rotation." }];
return (
Enterprise
Crafted for a single operator. Scaled for a practice.
Auth, RBAC, multi-tenancy, and remote capture — all optional, all backward-compatible with the single-operator default.
{items.map((i) =>
{i.t}
{i.b}
)}
);
}
function Pricing() {
return (
Pricing
A foundation you own. An upgrade when you need it.
Packet Intelligence is licensed per analyst seat, per year. Network Intelligence — the active layer for the gear under your team's care — is licensed per managed node, per year, and available to any Packet Intelligence customer.
Both run in a single install. One stack. One license file.
Packet Intelligence
Contact sales
TBD/ year · per seat
Capture. Understand. Answer. The whole product, one install.
Live capture & the PCAP library. Open anything libpcap-aware. Re-analyze, compare, and export without re-running a session.
47 protocol parsers. 29 IT · 9 OT/ICS · 3 IoT · plus the basics. OT is always routed first.
The AI analyst — local by default. Claude, Ollama, LM Studio, or SGLang. Cloud is an explicit choice, never the default.
34 anomaly rules + a custom rule builder. MITRE ATT&CK mapped — Enterprise and ICS. Every finding cites the packet.
JA3 / JA3S · JARM · ICS-CERT correlation. TLS fingerprints and CISA advisories on the way in. Internet not required.
Behavioral baselines + Purdue zone mapping. What's normal per device, and what crossed a boundary it shouldn't.
Four compliance frameworks. IEC 62443, NERC CIP, NIST CSF, NIS2 — plus an executive summary, on your cadence.
Network Graph, sequence diagrams, draw.io export. Blast radius in one click. Reports your team can ship.
Distributed capture. Streaming agents, one-shot field tokens, or fully air-gap PCAPs — all into the same library.
Network tools, built in. Ping, traceroute, and bundled iPerf3. Throughput problems, proven.
Multi-tenancy, RBAC, audit log. Off for solo operators. Ready the day you scale.
macOS · Linux · Windows · Docker. Air-gap supported. 14-day trial, no card.
);
}
function Signup() {
const [state, setState] = useState({ email: "", role: "", env: "", note: "", submitted: false, error: "", busy: false });
// Pick the API endpoint based on host. Override at runtime by setting
// window.__SPECTR_API__ = "https://api.example.com" before bundle.jsx loads.
const API_BASE = typeof window !== "undefined" && window.__SPECTR_API__ || (
typeof window !== "undefined" && /(^|\.)rex-labs\.tech$/.test(window.location.hostname) ?
"https://api.rex-labs.tech" :
"");
async function submit(e) {
e.preventDefault();
if (!state.email || !state.email.includes("@")) {
setState((s) => ({ ...s, error: "Enter a valid email address." }));
return;
}
setState((s) => ({ ...s, busy: true, error: "" }));
// Always stash locally as a fallback so we never lose a lead.
try {
const list = JSON.parse(localStorage.getItem("spectr_signups") || "[]");
list.push({ email: state.email, role: state.role, env: state.env, note: state.note, ts: Date.now() });
localStorage.setItem("spectr_signups", JSON.stringify(list));
} catch (_) {}
// POST to the signup API. If the API isn't reachable we still show success
// (the lead is in localStorage and the form is honest about reaching out).
try {
if (API_BASE) {
const res = await fetch(API_BASE + "/api/signup", {
method: "POST",
headers: { "Content-Type": "application/json" },
body: JSON.stringify({
email: state.email,
role: state.role,
env: state.env,
note: state.note,
source: window.location.hostname,
website: "" // honeypot
})
});
if (!res.ok) {
const j = await res.json().catch(() => ({}));
setState((s) => ({ ...s, busy: false, error: j.error || "Could not send. Please try again or email spectr@rex-labs.tech." }));
return;
}
}
} catch (err) {
setState((s) => ({ ...s, busy: false, error: "Network error. Please try again or email spectr@rex-labs.tech." }));
return;
}
setState((s) => ({ ...s, submitted: true, busy: false, error: "" }));
}
return (
Early access
Join early.
Early adopter
Second year free for everyone who joins the list before GA. One year paid, one year on us — same product, same support, same license.
SPECTR 0.6.0 + Net Intel 1.7.0 are in late beta. Join the early-access list and we'll reach out with pricing, a demo, and a license for your environment. We don't blast — typically one email when there's something specific to share.
✓ Pricing and per-seat / per-node terms
✓ Live demo against your traffic profile
✓ Air-gap deployment guidance
✓ Or just early-access updates — your call
);
}
function WhatsNew() {
const items = [
{
tag: "0.6.0",
date: "2026-05-16",
title: "perfSONAR hardening sprint",
body: "Five HIGH-priority follow-ups closed: drift-correlation cleanup on device/finding delete, non-blocking urlopen wrapped in asyncio.to_thread, idempotent INSERT OR REPLACE on drift rows, server-startup hook tested, schema migrations tested.",
meta: "+17 tests · 1,742 Net Intel"
},
{
tag: "0.5.9",
date: "2026-05-16",
title: "perfSONAR SSRF hotfix",
body: "CRITICAL: esmond Step-2 fetch previously followed an absolute URL without re-checking the host against TRUSTED_HOSTS — a hostile esmond could redirect SPECTR at AWS IMDS or internal admin endpoints. Closed with _is_url_trusted re-check on every absolute URI.",
meta: "+3 regression tests"
},
{
tag: "0.5.8",
date: "2026-05-15",
title: "Drift correlation (B4) — strategic differentiator",
body: "Net Intel detects config drift → automatically schedules a perfSONAR throughput + latency test on every affected path, persists pre/post deltas to the finding. \"throughput: 1000 → 750 Mbps (Δ -25%)\" appears in the findings modal.",
meta: "perfSONAR plan complete"
},
{
tag: "0.5.3",
date: "2026-05-15",
title: "iPerf3 throughput testing in Tools",
body: "New Throughput subtab. TCP/UDP, reverse mode, live canvas chart of throughput-over-time, color-coded summary cards. Bundled iperf3 binary for macOS (Apple Silicon + Intel) and Windows. WebSocket-streamed events.",
meta: "+71 tests · bundled binary"
}];
return (
What's new · changelog
SPECTR 0.6.0 · Net Intel 1.7.0
Eight releases shipped the full throughput-visibility stack — active iPerf3 testing in Tools, plus a five-phase perfSONAR integration culminating in automatic drift correlation. Capped by an SSRF hotfix and the v0.6.0 hardening sprint.