The useful way to watch Saša Jurić's GOTO 2019 talk "The Soul of Erlang and Elixir" is to resist the usual language-comparison reflex. Do not start with pattern matching, pipe syntax, Ruby influence, or whether a Phoenix application feels nicer than another web stack. Jurić's talk is stronger than that. It asks a systems question: what changes when concurrency, isolation, recovery, and observation are part of the runtime model instead of being rebuilt as a library convention in every service?[1][2]
That is why the talk still works as an OSS artifact in 2026. The GOTO session page frames it as an explanation of why Erlang and Elixir fit server-side systems, especially where high availability matters, and says the focus is the concurrency model rather than syntax or ecosystem tourism.[2] Elixir's own front page makes the same claim in a compressed way: Elixir runs on the Erlang VM, known for low-latency, distributed, and fault-tolerant systems, while giving developers a productive language surface for web, embedded, machine-learning, data, and multimedia work.[3] The interesting claim is not that Elixir has nice syntax over Erlang. The claim is that it puts a different failure vocabulary close to ordinary application code.
The video is worth annotating because Jurić teaches that vocabulary through a live system rather than a feature checklist. My inference from the talk, the official docs, and the demo repository is that the real lesson is process shape. Elixir applications become easier to reason about when work is split into many isolated processes, communication moves through explicit messages, and failure is routed to supervisors that know which pieces to restart and when to stop trying.[1][4][5][6]
Image context: the cover uses a real photograph of José Valim at ElixirConf 2014 rather than a logo, diagram, or generated runtime abstraction. The article's argument is about a language community carrying BEAM operating ideas into everyday application design, so a real conference photograph is the right visual register.[7]
Early in the talk, the "process" is the unit of design
The first thing to watch is how quickly the talk moves away from language ornament and toward process behavior. Elixir's official process guide gives the foundation directly: all code runs inside processes; those processes are isolated from one another; they run concurrently; and they communicate by message passing.[4] It also warns readers not to confuse them with operating-system processes, because BEAM processes are lightweight enough that tens or hundreds of thousands can run at once.[4]
That detail changes design pressure. In many mainstream stacks, creating a new concurrency unit can feel expensive enough that developers concentrate unrelated work inside shared services and then spend the rest of the architecture managing locks, callbacks, queues, and partial failure. In Elixir and Erlang, a process can be the ordinary boundary around one job, one connection, one session, one piece of state, or one controlled workflow. The process is not only a scheduling trick. It is the unit where state, mailbox, failure, and introspection meet.
This is why the talk's demos are more persuasive than an abstract pitch. Jurić is not saying "concurrency is easy" in the usual marketing sense. He is showing that the runtime gives engineers many small places to put responsibility. The system becomes less like one large mutable object and more like a field of isolated actors with explicit communication paths.[1][4]
In the message-passing sections, the mailbox is a contract
The next important idea is that message passing is not just a way to avoid shared memory. The Elixir guide says send/2 places a message in the recipient's mailbox and the sender continues; the receiver then searches its mailbox for a matching pattern.[4] That means every process owns both its state and the shape of messages it is prepared to handle.
That is a powerful contract, but not a magic one. A mailbox can still become a bottleneck if a process is asked to serialize too much work. A process can still accumulate messages if it is too slow or if its receive logic does not match what other parts of the system send. The lesson from the video is therefore narrower and more useful than "use processes everywhere." Use processes where they create a meaningful fault, ownership, or back-pressure boundary. A process is cheap enough to be a design primitive, but it still deserves a job description.
The demo repository reinforces this practical reading. It is not a polished framework sample; its README describes a small system with a load-control dashboard, a sum-calculation page, extra nodes, and a way to upgrade selected modules while the system is running.[6] That shape matters because the talk is about live operational behavior. The point is not that every app should copy the demo. The point is that BEAM systems make it natural to ask which process is busy, which message path is overloaded, and which component can be restarted or upgraded without turning the whole service into a single error domain.[1][6]
In the failure sections, "let it crash" means planned recovery, not indifference
The phrase "let it crash" is easy to misuse. In weak form it sounds like laziness: do less error handling and hope a restart fixes things. The official process guide is more precise. It says failures in isolated processes do not corrupt the state of other processes by default, and links let processes establish failure relationships; most often, processes are linked to supervisors that detect death and start replacements.[4]
The Erlang supervisor documentation supplies the missing operational discipline. A supervisor starts, stops, and monitors child processes, with the basic goal of keeping children alive by restarting them when necessary.[5] It also defines restart strategies such as one_for_one, one_for_all, and rest_for_one, and it includes restart intensity and period settings so a supervisor can stop a restart storm instead of endlessly repeating a doomed recovery.[5]
That is the mature reading of Jurić's argument. Fault tolerance is not the absence of failure. It is failure with containment, names, limits, and escalation paths. If one child process dies, a one_for_one supervisor can restart only that process. If a group is structurally dependent, a different strategy can restart a wider set. If failures repeat too quickly, the supervisor gives up and lets the next layer decide.[5] This is a much richer model than a blanket try/catch around a request path. It turns recovery into topology.
The lasting lesson is a boundary budget
The strongest engineering takeaway from the talk is that Elixir and Erlang give teams a different boundary budget. You can spend processes freely enough to isolate work, spend supervisors to encode recovery relationships, and spend message passing to make ownership explicit. That does not eliminate architecture. It makes architecture visible at runtime.
This also marks the adoption boundary. If an application is mostly batch computation with simple failure semantics, the BEAM model may not be the decisive advantage. If the system is long-running, connection-heavy, interactive, stateful, or operationally sensitive to partial failure, the process-and-supervision model becomes much more interesting. The question is not "Should every backend be Elixir?" The better question is "Does this workload benefit from treating failure, state, and concurrency as first-class runtime objects?"[3][4][5]
Jurić's talk remains valuable because it keeps that question concrete. Watch the video for the demos, but keep the written model in mind: lightweight isolated processes make responsibility small; mailboxes make communication explicit; supervisors make restart policy part of the system tree; and restart intensity prevents recovery from becoming denial. That is the soul of the runtime argument. The syntax is the surface. The failure boundary is the product.[1][4][5][6]
Sources
- GOTO Conferences, "The Soul of Erlang and Elixir - Sasa Juric - GOTO 2019," YouTube video, recorded at GOTO Chicago 2019.
- GOTO Chicago 2019, "The Soul of Erlang and Elixir" - session page with talk framing, audience, and concurrency-model emphasis.
- Elixir, "The Elixir programming language" - official overview of Elixir on the Erlang VM, fault-tolerant systems, platform features, and Erlang compatibility.
- Elixir documentation, "Processes" - process isolation, lightweight concurrency, mailboxes, links, tasks, state, and supervision-oriented failure handling.
- Erlang/OTP documentation, "Supervisor Behaviour" - supervision principles, restart strategies, child specifications, and restart-intensity limits.
- Saša Jurić,
sasa1977/soul_of_erlang_and_elixir- demo source repository for the talk, including load-control dashboard, release, node, and upgrade notes. - Wikimedia Commons, "File:José Valim - elixirconf-43 (14795675701).jpg" - real 2014 ElixirConf photograph by Augie De Blieck, used as the article image source.