What do we do with logging in libraries? Logging has been a major headache for library authors for a long time. Library code is dropped into highly opinionated application environments, and whatever choices you make as a maintainer, you simply cannot satisfy everybody. You use info logs? More like debug. Debug logs? Very noisy. No logs at all? Ugh, zero observability. There is simply no…
Teaching LLMs new UI tricks Chat interfaces are by far the most popular way of interacting with LLMs today. And they're fairly simple to build: all you need is a page with a single input to accept user messages and a place to render the LLM's response. Once this is done, the next bit of complexity you usually want to introduce is streaming responses and rendering Markdown. And then you basically…
Concurrent Reads, Serialized Writes with GenServer and Registry Of all the OTP abstractions, GenServer is the most iconic one. As a result, it is usually the first thing newcomers learn to use, and they inevitably run into some common pitfalls. Let's talk about one of them. GenServers are commonly used whenever there is a need for a stateful process that will store some data and make it available…
A Farewell to Code Reviews Code reviews are dead and only now do we begin to notice. Hardly the only or most important casualty of the great AI leap, but an important one nonetheless. For quite some time we had a good thing going and I will remember it. Maybe you remember it too or maybe you never experienced the tech industry before 2025 and want to know what it was like. Let me tell you how it…
AI future will be nothing like present There is a very popular opinion that coding agents just make senior devs more productive. AI is just a tool that allows you to off-load the boring part of writing code to the agent so you can focus on real engineering™. Nothing dramatic is happening, just another addition to the toolbox. And it's not like this isn't true. It's absolutely the case that great…
PostHog Elixir SDK is good The PostHog Elixir SDK 2.0 just dropped . What is PostHog? Why should you care about its SDK? Why do I think it's good? Bear with me, I'm about to tell you how I spent my summer. Dear Diary In May 2025 I found myself with a lot of free time and an appetite for writing a logging library from scratch. How exactly I developed this appetite is a whole other story, but the…
5-minute guide to Elixir caller tracking Caller tracking has been part of Elixir since 2018 , and yet it remains a relatively obscure mechanism. Let's fix this with a 5-minute guide. What is caller tracking Asynchronous tests are the best. They are possible because in many cases we can trace what is happening in the application all the way back to the test. We say that a test process "owns"…
It's rude to show AI output to people Imagine you're a scrambler. Imagine that you encounter a signal. It is structured, and dense with information. It meets all the criteria of an intelligent transmission. Evolution and experience offer a variety of paths to follow, branch-points in the flowcharts that handle such input. Sometimes these signals come from conspecifics who have useful information…
Hide Your Nodes, AAAAAA@AAAAAAA is Coming 06:04:59.473 [error] ** :"myapp@myhost": Connection attempt from node :AAAAAA@AAAAAAA rejected since it cannot handle [~c"UNLINK_ID", ~c"HANDSHAKE_23", ~c"BIG_CREATION", ~c"BIT_BINARIES", ~c"EXPORT_PTR_TAG"].** This is NOT what you want to suddenly pop up in your logs at 10 PM. I am a simple man. I host my silly little hobby projects on a single VPS server…
What Does NimbleOwnership Do Anyway? If you've worked with Elixir for a while, you know that there are two kinds of tests: the good ones and the ones that need to be justified. The former being, of course, asynchronous tests – fast and joyful, and the latter being synchronous tests, the ones that get a side eye in code reviews. Anyone who tries to write asynchronous tests sooner or later learns…
List of True Things About Elixir Logger Handlers and Backends Dear reader, I am easily confused by loggers. For a long time, the Elixir logger was simple enough that I could live with it. But starting with version 1.15, something changed, and now I'm confused. Luckily for me, Elixir.Logger documentation does an excellent job explaining everything. The problem is that it's a lengthy read and I need…
Do Repeat Yourself The conventional wisdom stemming from the famous DRY (Don't Repeat Yourself) principle is that if you notice yourself copying code around, it's a smell. And I agree. Mostly. More often than not. Listen, it's complicated. I think this is a good principle, but even a perfectly functioning analog clock can be wrong for half a year, okay? One of the few strong opinions I have is…