What the Mini SOC is for

The goal is to automate as much of home and small-business security and connectivity management as can be shown to be safe. Show it first. Then automate it.

Every kind of action climbs the same ladder, one step at a time.

StepWhat the Mini SOC doesWho acts
1. ObserveRecords and shows. The baseline's shadow mode works this way.Nobody
2. RecommendSays what to do and why.Me
3. ProposePrepares the change.Me, with one click
4. Act and reportMakes a narrow, reversible change and logs it.The Mini SOC, with an undo

An action moves up a step only on a measured record from the step below: how often it was wrong, and how often I overruled it. Today everything sits at observe or recommend. The first candidate for the upper steps is moving an unknown new device into an isolated network.

Why build it

Most homelab SOC projects on GitHub stop once the plumbing works. They skip the question a SOC manager would ask first: can the model's verdict be trusted, and where does a person have to stay in the loop?

After 25 years in cybersecurity, I've watched alert pipelines fail in the same place: the dismissal nobody reviews. An AI tier moves that point. It doesn't remove it. This build puts a local model into a real pipeline and measures where it helps, where it's wrong, and what it costs to keep a person in charge.

How the Mini SOC decides

TierWhat it isWhat it decides
L1Deterministic rulesWhether something is an alert. Yes or no.
L2Qwen 3.8-27B, MLX 8-bit, on the same Mac StudioWhat the alert most likely means, and how sure it is. Unsure means escalate.
HumanMeWhether to act, and whether the alert is closed.

The rules watch for a device the network has never seen, a changed device name, two devices reporting the same name, a configuration change, an admin login from a new address, and UniFi's own security detections. None of them reads what a device name says. They fire on change.

Thinking mode is off. Simon Willison's verdict on Qwen 3.8-27B's default setting, on 16 August 2026: "It's absolutely not a good way to run the model, especially on consumer hardware." For sorting an alert, it doesn't earn the wait.

The guardrails

What the traffic shows, and what it can't

The gateway logs every flow it routes. The Mini SOC reads that log every 15 minutes and keeps daily totals per device: which services, which domains, which countries, how much. Two things are built on it. A recommended VLAN for each device, where the device type comes first and traffic is the evidence. And a baseline of what normal looks like for each device.

The log has a blind spot. Two devices on the same network talk through the switch, and the gateway never sees it. On a flat network, "no local traffic seen" proves nothing. It becomes evidence once devices sit on separate VLANs, where every attempt to reach a neighbour crosses the gateway and shows up as blocked.

The first test made the case for fixed rules. Qwen put the game console in the media VLAN. The rule says a console needs the internet and nothing else. No traffic showed another device using it, so the rule won and the placement waits for me.

The baseline learns for 14 days, then runs in shadow mode. Deviations are listed and never sent as alerts, and I mark each one expected or suspicious. That gives a false-alarm rate for each kind of deviation before any of them is allowed to page. Measure it, then trust it.

Where the Mini SOC stands

PartStateSince
Read-only collector, polls the network controller every two minutes Live 25 Sep 2026
L1 rules: deterministic checks, alert or no alert Live 25 Sep 2026
L2 triage: Qwen 3.8-27B assesses each alert and escalates when unsure Live 26 Sep 2026
Decision log: rule version, model, prompt hash, raw output, my call Live 26 Sep 2026
MCP server: read-only query tools for an AI assistant Live 25 Sep 2026
Recommended actions: the model picks from a fixed list each rule allows, and never executes one Live 26 Sep 2026
Desktop widget and menu-bar status First version 26 Sep 2026
Local web UI to classify alerts: every classification becomes a training label First version 26 Sep 2026
Rogue access points: a network copying yours is always high; the building (crowded or isolated) only changes how unrelated networks read Live 27 Sep 2026
Where each device is connected: switch or access point, port, speed and address Live 28 Sep 2026
Asset inventory: every device the network has seen, when and where, and the controller's fingerprint of it Live 28 Sep 2026
Traffic per device, from the gateway's flow log, kept as capped daily totals Live 28 Sep 2026
Recommended VLAN per device: device type first, traffic as evidence, the model's pick checked by fixed rules First version 28 Sep 2026
Per-device baseline: learning until 12 Oct, then shadow mode to measure false alarms before anything pages First version 28 Sep 2026
Ongoing alerts grouped into one issue per device, with an occurrence count; repeats are summarised instead of paging again Live 28 Sep 2026
Where an admin login came from: city and network from a local IP database, no address sent anywhere Live 29 Sep 2026
Triage mode: work through the open issues one at a time First version 29 Sep 2026
Security alerts show the blocked flow behind them: source, destination, rule, and what doesn't add up Live 2 Oct 2026
Threat alerts grouped as one incident around the device they target; closing an issue closes only what was on screen Live 3 Oct 2026
Audit sampling of events no rule matched Next
Measurement: verdict stability, latency, what the model changes versus rules alone Next
A credential that can only read Next
LoRA fine-tuning of the local model on those labels (a first run needs about 300) Next
Connectivity: internet uptime and latency, Wi-Fi health, access point, switch and NAS health Next
Automation ladder: proposals I approve with one click, then narrow actions that run on their own (first: isolating an unknown new device) Next
Second site, phone alerts, air quality Later

Build log

The code is public in promise-and-risk-labs on GitHub, minus anything that identifies the network it watches. The raw output stays private for the same reason.