Animated scalar field, quantised into contour bands. Decorative.

kplanky.dev

GitHub

Chachris
Martin Kurz

I build software from scratch to understand how it works.

Studying
Computer science at Mahidol University International College
Based
Thailand. Thai and German citizenship, so no EU sponsorship needed
Available
Internships now. Full-time from December 2027

Selected work

Selected work

Rust / MIT

beaconscope

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.csv Version0.4.0 Captured2026-07-29 Inputbundled fixture, not a real capture Viewscrolls 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.

Java 21 / Spring Boot / React / PostgreSQL

corvo

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.

C / flex and bison / pthreads

ic-webserver

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.html ToolApacheBench 2.3 Captured2026-07-29 Conditionsloopback, 1,000 requests at concurrency 50 Viewscrolls 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 ]

Python / pandas / scikit-learn / Jupyter

nuclear-uranium-analysis

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.

Python / XGBoost / two-person project

Data-eng-Airbnb

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 science InstitutionMahidol University International College Since2023, ongoing
Introductory programmingPython Data structures and OOPJava AlgorithmsKotlin
ContestICPC Thailand 2026 RegionCentral ResultCompeted