The OpenCanary Experience: Genesis

Born of vocational awe. It outgrew its maker — and its machine.

11 October 2023. A canary went up on the open internet. It has been running, uninterrupted, ever since — the data growing past what one person's skills could search, and one tired machine could hold.

A beam of light climbing from a single origin point, passing through two barriers, and bursting into light at the second one
11.10.2023 — origin Man — skills Machine — oomph Claude Code — breakthrough

The Data Tsunami

176,043,025 connections. One exhausted i7.

Not a Splunk problem. A resource problem. Running in a VM on a decade-old Lenovo Haswell i7 with 16GB of RAM, Splunk could ingest the log data — but not report on those 176 million log entries.

Host Lenovo ThinkCentre CPU Haswell i7, ~2013 Role Hyper-V Server RAM 16GB total
0
connections it needed to search through, at once
search job: timed out
the same core, holding the honeypot,
the hypervisor, and Splunk — at once

Breakthrough

Along came Claude Code.

For a long time it just failed. Every query that reached for real volume resourced-out and died on the box — too much data, too little machine.

Then a mid-2025 Splunk upgrade changed how the events were stored, and even the exports that used to work stopped working.

That's where Claude Code came in. I'm the muse — the hunches, the direction, knowing which thread to pull. It's the worker — turning each call into batched, format-aware exports that actually finished.

A cracked, strained server sending a beam of light into a calm glowing cylinder
BRAHMA · Hyper-V (strained) chunked exports REST, not the UI resumable batches 175M+ lines, safely exported

The Eureka Moment

Complex SPL became one line.

SPL: | tstats count where index=oc_prod earliest=-30d@d latest=@d by _time span=1h | eval bucket=... | join type=left source_ip [ search index=samba_logs ... ] | stats sum(count) as total by host, port, src_ip | eventstats ... export --host brahma --output chunk_003.csv --chunksize 250000 --resume-token ... rest --endpoint /services/search/jobs --params earliest=... latest=... normalize_ip(field) { ... } // dual-format $NORM handling for f in oc_export_*.csv; do awk -F, ...; done
> analyse this raw data. build me a storyline.

No schema notes. No hints about which port matters or which country to watch. Detailed to the letter for the extraction. Bare, abstract, almost nothing — for the meaning. That's the entire brief.

Ingestion. Digestion. Revelation.

Claude got the data, read the data, found stories.

The spike

23 Aug 2024: 1,310,610 connections in a single day — flagged as the anomaly it was, not averaged quietly away.

The repeat offender

220.120.147.167 (South Korea) alone sent 10,659,664 hits — named as a singular, persistent actor, unprompted.

Mirai, unnamed but recognised

Verbatim Mirai botnet default credentials, called out without being told to look for Mirai:

UsernamePasswordAttempts
adminadmin627,939
rootvizxv78,481
rootxc351172,294

The file share, mixed in

6,915,582 SMB events, ~39,600 files received, and just 3 distinct malware binaries in 3.5 years — RemCom alone behind 99.96% of every drop.

Top ports, cumulative

MSSQL · 1433
57.9M
RDP · 3389
54.7M
SSH · 22
38.9M
VNC · 5901
18.1M
Telnet · 23
4.7M
Redis · 6379
1.1M

Meet The Team

Muse and worker.

The intuition, the hunches, the inspiration — mine. The ability to deliver, unwaveringly, quickly and usually accurately — Claude.

Teamwork.

It knows everything.*
*But not which everything matters here. That's still the muse's job.

A loose organic green thread and a precise amber thread braid together into one strand of light and continue on
Muse — intuition Worker — execution The story

Improvements: VNC password detection

The VNC module's known-password list went from 6 entries to roughly 2,800. Not an exhaustive list — and pushing it higher asks questions of resources — but a big increase in the on-the-fly matching of VNC password attempts.

Evolution

Complete. Sustainable. Still growing.

0
days of complete, unbroken telemetry — as of today

What used to die mid-search is now a living record: complete back to day one, current as of today.

Then MongoDB scans started showing up — the internet hunting for exposed instances. So Claude Code and I built a MongoDB module for OpenCanary, and the pull request was accepted into the project everyone else runs too.

A glowing loop with a comet travelling around it, and a second comet breaking away to join a larger shape
export → mix → story → repeat mongodb.py — merged → OpenCanary