Finds command-and-control beaconing in connection logs from timing alone, offline.
It scores how regularly a channel repeats, using FFT autocorrelation against
interval statistics chosen to survive jitter. The score decomposes into
regularity, concordance and strength, so you can argue with a verdict instead of
taking it on trust.
Commandbeaconscope --out table examples/beacon-3600s.csvVersion0.4.0Captured2026-07-29Inputbundled fixture, not a real captureViewscrolls right
SRC DST EVENTS PERIOD CV JITTER CONCORD STRENGTH SCORE VERDICT
10.0.0.5 c2.example.net 60 3600.0 0.000 0.000 1.000 0.983 99.7 HIGH
10.0.0.5 updates.example.net 721 - 0.932 0.659 0.011 0.064 5.0 LOW
10.0.0.9 news.example.org 580 - 0.962 0.684 0.000 0.060 3.1 LOW
10.0.0.5 api.example.io 2276 - 0.967 0.684 0.000 0.068 3.0 LOW
10.0.0.23 mail.example.com 1166 - 0.985 0.691 0.023 0.050 2.4 LOW
10.0.0.23 chat.example.net 1595 - 0.998 0.687 0.011 0.082 2.1 LOW
10.0.0.9 cdn.example.org 1910 - 1.006 0.695 0.003 0.050 1.1 LOW
7 channel(s) analyzed.
6 channel(s) show PERIOD '-': the autocorrelation peak disagrees with the median
gap, so no period is reported. Either the cadence is below 2 x --bin (120.0s), and a
smaller --bin will resolve it, or the channel has no period at all. They are still scored.
110 tests. On the fixture below, one channel scores 99.7 HIGH
against six between 1.1 and 5.0. The score is regularity 50.0 + concordance 30.0 +
strength 19.7, so a verdict can be taken apart.
Real-time multiplayer Othello with matchmaking and three tiers of AI, each
written as a distinct opponent rather than one engine on a timer. The server is
authoritative and the browser only draws the state it is sent, so a tampered
client cannot invent a move. Rules run on 64-bit bitboards, and a full-width
negamax sits underneath as the correctness reference the shipped searches are
checked against.
Bots play greedy one-ply, alpha-beta to depth 3, and
iterative deepening to depth 5. Games against them are unrated practice.
Human-vs-human is rated, Elo K-factor 32, on server-held five-minute banks.
A concurrent HTTP/1.1 server with CGI. The grammar is not parsed by hand: it is
written as a flex lexer and a bison grammar, so the parser follows the
specification instead of an accumulation of string handling. Connections come off
a thread pool.
55,239 req/s with keep-alive, 36,800 without. Sub-30ms bursts over
loopback, dominated by connection setup. Not steady-state throughput.
Commandab -n 1000 -c 50 -k http://localhost:8080/test.htmlToolApacheBench 2.3Captured2026-07-29Conditionsloopback, 1,000 requests at concurrency 50Viewscrolls right
[ ApacheBench banner and 12 progress lines omitted ]
Server Software: ICWS
Server Hostname: localhost
Server Port: 8080
Document Path: /test.html
Document Length: 4096 bytes
Concurrency Level: 50
Time taken for tests: 0.018 seconds
Complete requests: 1000
Failed requests: 0
Keep-Alive requests: 1000
Total transferred: 4283000 bytes
HTML transferred: 4096000 bytes
Requests per second: 55239.46 [#/sec] (mean)
Time per request: 0.905 [ms] (mean)
Time per request: 0.018 [ms] (mean, across all concurrent requests)
Transfer rate: 231045.53 [Kbytes/sec] received
[ connection-time and percentile tables omitted ]
Asks whether public opinion of nuclear energy predicts uranium stock prices.
Opinion and price series aligned onto a common timeline, then correlation and a
regression fit against a stated null.
Correlation 0.9, p < 0.05, null rejected.
Two trending series, so read it as association and not as a mechanism.
A pipeline predicting Airbnb listing ratings, ingest through to dashboard. Two of
us built it; I did the preprocessing, the rating normalisation, the XGBoost model
and the dashboard.
Also on the repositories tab: a multithreaded site-mirroring crawler, a Unix shell, a duplicate-file finder, an
object-oriented dungeon crawler, a no-framework to-do app, and a NEAT-trained Pong AI.
The record
RoleTeaching assistant, computer scienceInstitutionMahidol University International CollegeSince2023, ongoing
Introductory programmingPythonData structures and OOPJavaAlgorithmsKotlin