Posts
All the articles I've posted.
Hooked on Widgets: A Better Pattern for Reusable LiveView Components (ElixirConf EU 2026 talk)
My ElixirConf EU 2026 talk on building reusable, stateful LiveView components with a cleaner pattern than the usual approaches.
Hooking up with LiveView: stateful widgets with function components(opens on curiosum.com)
↗ curiosum.comA reusable pattern for self-contained LiveView widgets that manage their own state, events, PubSub and URL params. Published on the Curiosum blog.
Fix Alpine + Phoenix LiveView: 5 Integration Patterns(opens on curiosum.com)
↗ curiosum.comPutting the A back in PETAL: five common Alpine.js and LiveView problems, from lost state to DOM conflicts, and the patterns that fix them. Published on the Curiosum blog.
Interactive Data Tables in Phoenix LiveView: AG Grid Integration Made Simple(opens on curiosum.com)
↗ curiosum.comIntegrating AG Grid with LiveView for feature-rich tables: setup, data presentation and handling complex Ecto data. Published on the Curiosum blog.
Domain-Driven Design (DDD): EventStorming for Tactical Design — Strengths and Limitations
Where EventStorming's verb-centric modeling fits Domain-Driven Design tactical design, where it falls short, and how to combine it with other techniques.
Domain-Driven Design (DDD): EventStorming example for System Design
How EventStorming guides system design from the big picture down to software design, with its modeling primitives and workshop levels.
Domain-Driven Design (DDD): Divide and Conquer the Domain
Why a single, consistent domain model is an illusion, and how Bounded Contexts let you divide and conquer domain complexity.
Domain-Driven Design (DDD): Strategic Design Explained
DDD Strategic Design explained with an example: subdomains, Ubiquitous Language, Bounded Contexts and Context Mapping for a university registration system.
Elixir: map casting to structs (with checks at compile time!)
Validate map keys against a struct at compile time with a small macro, instead of discovering typos at runtime after deployment.
Adding stream_async() to Phoenix LiveView
Implement asynchronous assigns for LiveView streams and generate the boilerplate with a stream_async() macro.
How to report Postgres custom errors in Ecto Changeset
Capture custom Postgres errors as Ecto.Changeset errors instead of raising exceptions — no try/rescue, works out of the box with Phoenix.