Learning in Public
Notes on systems stuff, tooling and whatever side quest I'm on at the moment, wrong turns included.
2026
Where/what is my value as an engineer today?2026-10Agents write most of the code now. Understanding what they built isn't enough IMO.
Branding a primitive2026-09Nobody installs a sync library just because it exists, so even a primitive needs a brand.
Hiding IPs from my own relay is harder than it sounds2026-08I wanted my relay to never see IPs. I ended up changing the sentence instead.
TrueSeal delivery guarantees2026-08My sync library promised every message arrives. It does, sometimes twice, and I changed my mind about who should deal with that.
Membership without a server2026-08A group of devices with nobody in charge of who's in it, and the three ways that went wrong.
Messages from the future2026-07My sync protocol keeps messages it can't read yet, so anyone could fill a device's inbox with junk labelled version 99.
Noise protocol its not concurrent2026-07Two goroutines, one cipher state, and a non concurrent safe library.
2 day debug session2026-05It works on my machine, at its finest.
Anchors: first test2026-05I ran a test, and it did a thing.
A or B, not A/B2026-05A/B testing can turn into a way to skip the thinking. Sometimes you have to pick A or B.
The spectrum of error handling2026-04Result types, panics and assertions are for different situations, and most codebases blur them together.
Why I never finish side projects (and why that's fine)2026-04An unfinished project usually means I got what I came for and moved on.
Side quest: anchors (early results)2026-03Static analysis plus LLM enhancement, and a PoC that found a bug 32x faster than an AI agent crawling the code.
Side quest: useful AI in complex systems?2026-02Why AI tools get lost in large codebases, and an idea I'm exploring to fix it.
Block vs stream ciphers2026-01Fixed-size blocks or a keystream: the two ways ciphers process data, and why I picked ChaCha20 for my key-value store.
Edge-triggered vs level-triggered epoll2026-01The two epoll notification modes, why edge-triggered is the tricky one, and which one I'm using.
2025
IPC vs RPC2025-12Both let processes talk to each other. IPC makes you deal with the sockets, RPC hides them behind function calls.
Wire protocol framing (and why it prevents attacks)2025-12How to tell where one message ends and the next begins, and why getting it wrong opens you up to buffer overflows and DoS attacks.
Why your web service doesn't need Rust (probably)2025-12I don't like Java and I love Zig and Rust, and none of that matters when network latency is 10,000x bigger than your FFI overhead.
Rust vs Zig: the ecosystem maturity gap2025-11I expected Zig to be the simple one and Rust the hard one, then I built the same project in both and Zig's tooling fought me at every step.
Knowledge vs experience in SWE2025-11Ten years of getting humbled, why experience beats knowledge, and why you should say yes to the shitty projects.
A learning framework to fight AI brain rot2025-11How I'm learning Rust and Zig in parallel without letting AI do the learning for me: knowledge bases, project logs and a healthy amount of suffering.
Stack vs heap memory in Zig2025-11Where your data lives in Zig, how the stack and the heap differ, and the use-after-free bug that taught me why it matters.
The Zig hashmap gotcha: it doesn't copy your data2025-11Zig's HashMap keeps pointers to your keys and values instead of copying them, which is a use-after-free waiting to happen.
String vs &str in Rust2025-11Rust's two string types, when to use each, and what the difference has to do with memory.
Rebuilding P2P secret sharing2025-11Rebuilding a P2P, end-to-end encrypted secret sharing CLI from scratch.