TL;DR
Last week, I attended my fourth CodeBeam Europe conference, my third time in Berlin, this time as a speaker presenting a talk about Oban. This post is a report on the talks that I attended, and on the hallway talks, the most interesting part of this conference.
Tuesday
I started my journey with a rented Bajs bike, carrying a backpack and a small Kipsa bag, so this was manageable. It was an easy ride to the number three tram that took me to the 290 bus connection. All together it took me one hour and cost 3,16 euros of cost, making it as green as possible you can be in Zagreb (I also noticed that attendsees are arriving at conferences using trains, which I would also do it, but Zagreb is still not well connected via train with the rest of Europe).
I was late for the speakers’ dinner, but still I managed to get interesting discussions over tasty chicken, mostly about teaching students. Thirty minutes of easy walking, and I was in my hotel room, which was very cold for my taste.
Wednesday
Got my t-shirt and speakers badge, and here we go! I received my t-shirt and speaker badge, and the conference began! For me, the best part of every conference are is the hallway tracks, that you can not get online. You just browse through the coffee break area, and start taking talking with other attendants by introducing yourself. Before the conference opening, I had interesting discussions with Frank and Ramiro. Ramiro was also a speaker. His talk was about monitoring LLMs. And Frank is using an LLM in the insurance domain. For now, the LLM helps them to route service support calls to a human, via a text chat interface.
Opening Keynote

Josh Price from Alembic, creators of the Ash framework, keynote‘s title was A Survival Guide for the AI Age. What I first learned form The first concept presented in this talk is Jevons Paradox:
William Stanley Jevons observed in 1865:As steam engines became more efficient and required less coal, overall coal consumption increased dramatically.
He made a parallel with vibe coding. With vibe coding, applications become much cheaper, so there will be increased demand for LLM coding models.
The next thing I learned is was Amara’s law:“We tend to overestimate the impact of a technology in the short run and underestimate its impact in the long run.”
Josh then gives gave an overview of how programming changed over history, ranging from punch cards to BEAM. The importance of BEAM was that it introduced computing before the Internet, concurrency before multicore, and nanoservices before microservices. The core of this innovation was Genserver, and the genserver is an agentic loop.
Then came another parallel that I like, comparing vibe coding and slot machines. For both, you buy tokens, put those tokens into them, and hope that you will win a jackpot. If you fail, you will do another spin, which is in the vibe coding context, another prompt.
With vibe coding, we got something new, and that is spec-driven development. For example, Github has a spec kit tool that could help you write a non-technical specification for your next application.
In the end, Josh gave as us a survival guide in the AI world:
– climb the ladder of abstraction
– software is cheaper, there will be more of it
– test, judgement, and experience
– do not allow the llm to talk in its own language
– great specifications are needed
– security (as always)
– llms follow instructions in the context window (greater the context, better answers)
– Simon Willson‘s blog, simonwillison.net (I know him via Hackernews)
– private data, untrusted content, agent external communication
– llm models are getting better and better
– critical thinking
– prepare for mcp, apis, a2a, acp protocols (Prepare for MCP, APIs, A2A, and ACP protocols)
OTP Update
The focus of the 28.1 OTP update is security. OTP now supports post-quantum algorithms, ml-dsa and ml-kem. New features are compiled and precompiled regular expressions. In order to prepare ground for greater OTP adaptation, the docs now contain info on how to report security issues on Github so that it is not publicly visible. CVE issues are now more visible in the OTP release notes, and there is metadata for a software bill of materials.
GLEAM
In the spirit of the CodeBeam agenda, this year Gleam has strong support; one track was almost a Gleam track. In UI testing with Lustre, Hayleigh presented a UI testing framework for Luster, the Gleam web framework. Similar to LiveViewTest, with this framework you do not need a browser. You are directly testing the view-update-model loop. It is very powerful because you do not need to write HTML in Lustre; all HTML could be presented with Lustre. And yes, tests are blazingly fast. “Adopt Gleam in a Boring Way” was a talk by Yoshie. She discussed an interesting approach for how to present all the features of Gleam that give it an advantage over other BEAM languages.
Giacomo, in his talk “You Do Not Need an ORM,” brings another fresh idea. In Gleam Squirrel, things are the vice versa way. You keep your SQL code in your code base. The reasoning is straightforward: SQL is the language for talking with the database. And when you see your SQL, there is no magic to what is running on the database, so debugging and investigation of errors is much easier. And you can easily execute those SQL statements in some other tool. Using Squirrel, you can decode your SQL code in Gleam functions! As an aid in writing SQL queries, Giacomo is using DataGrip, where you have full SQL code competitions that could be supported by AI. As SQL gets new features, modern-sql.com is also an excellent resource.
MoodBot: A Tiny Robot
I love everything about Nerves; the NervesEU conf was a blast in Varberg. So I was very excited to see this talk. This was a home project of Carsten when his children wanted a home robot. So we have a paperwhite screen, membrane, a Raspberry Pi, Nerves, and the Whisper (if I remember correctly) speech recognition model. You say something to the robot, and it recognizes your emotions and displays them on the paperwhite screen. The emotions are robot facial expressions drawn by his children.
Supervisor Saving the Day
Ingela, an OTP core team member, talked on supervisors from the Erlang perspective. To be honest, when I need to do something with supervision trees, or when I am listening to a talk about them, I need to reference the Elixir in Action book chapter on the supervision tree. It is a complex topic with a lot of attributes with strange names (e.g., one_for_one) named by the Ericsson engineers. This is the official Elixir documentation explanation:
:one_for_one – if a child process terminates, only that process is restarted.
So even the Elixir core team could not explain it easily :). If a child process terminates, it is gone forever (its pid); on restart you get a new pid (new process). So referencing that only that process is restarted is ambiguous. A better statement would be to state that only one child is spawned.
Building a Fintech System
Erik, the author of the BEAM book, shared his great experience on how to create architecture for such systems. Some of the concepts that we must be aware of are process boundaries, process archetypes, message flow, idempotent change flow, and process types. As a bonus tip, he shared how to handle the money (I have a talk with that name in one Elixir ZG Meetup). The money value must not be a float. The best option is an integer with precision, and then you divide that integer with 10 at the power of that precision. The tricky part is to set that precision. For example, EUR precision could be 2 for presentation, but there is also storage precision. You do not want to lose any part of a cent! And BTC precision could not be the same as the EUR one.
My Talk
My talk was “How We Tamed 20 Million Oban Jobs in Production.” When you hit the stage, there could be some unpredictable issues. You need a mic; I chose a fixed one. The technician first put the transmitter in my hoodie, which was very uncomfortable; then I moved it in my jeans back pocket. We did not perform a basic mic test with “testing, testing,” and of course, the mic did not work for the first minute of my talk, which put me a little bit off track, so I speed up my talking.
Adding JIT to AtomVM
Paul presented how to squeeze JIT in AtomVM. I learned that with asdf on Mac, Erlang does not contain JIT out of the box.
Lightning Talks
I always enjoy this session. This year, Petar presented the amoc testing library for Erlang that helps you with concurrent testing. Yoshi presented the problem of setting up the environment for Elixir development. You need Elixir and Erlang, and this does not come with one command, as Gleam has. She has a project for creating such a command for Elixir. Peter presented his evolving language eyg.run. Krasen talked about how you can do sandboxing using cnodes. Etyzer are types for Erlang, presented by Albert. Paul explained how to use Atom escriptize, and in the end we saw how the safe security tool created by Erlang Solutions compares with sobelow.