We can't find the internet
Attempting to reconnect
Something went wrong!
Hang in there while we get back on track
Prevent race conditions with `Ecto.Query.lock/2`
Two users buying the last item simultaneously can cause overselling. Use PostgreSQL row locks with lock: "FOR UPDATE" to prevent concurrent updates fr...
Use `temporary_assigns` for large lists in LiveView
Sending entire lists over the socket on every LiveView update kills performance. Mark list assigns as temporary to send them once and drop them from s...
Use `send_update_after/4` for delayed LiveComponent updates
Manual timer management with Process.send_after/3 in LiveComponents creates cleanup complexity. LiveView's send_update_after/4 handles delayed updates...
Use router `on_mount` hooks instead of duplicating LiveView mount logic
Copy-pasting the same assigns across every LiveView mount/3 function creates maintenance nightmares. Router-level on_mount hooks run automatically bef...
Stop mixing LiveView handlers with JavaScript hooks
Handling the same event in both Phoenix and JavaScript creates race conditions and unpredictable behavior. Keep server logic in LiveView handlers and ...
The amazing v/1 helper function
I may be late on this one but today I learned about the v/1, a helper function that retrieves the value from a previous expression by its line number ...
Phoenix contexts should return tuples, not raise
Phoenix context functions that raise exceptions break LiveView error handling and force try/catch everywhere. Tagged tuples enable composable error ha...
Prevent duplicate Oban jobs with `unique` worker options
Multiple button clicks or retries can enqueue the same background job multiple times, causing duplicate charges, emails, or API calls. Oban's built-in...
Stop rewriting Ecto queries from scratch - use `Ecto.Query.exclude/2` instead
Building complex queries often means starting with a base query, then customizing it for different use cases. Most developers duplicate the entire que...
Fixing `Ecto.StaleEntryError` with optimistic locking patterns
Race conditions in concurrent updates cause cryptic Ecto.StaleEntryError crashes in production. The error happens when multiple processes try to updat...
Phoenix application configuration
The config folder plays a pivotal role in any phoenix application. Its constituents are normally config.exs, dev.exs, prod.exs, runtime.exs and test.e...
Hunting down flaky tests with `--repeat-until-failure`
Nothing destroys developer confidence like tests that randomly fail in CI. One day your build is green, the next it's red with the exact same code. Th...
Impelementing Infinite Scroll in Phoenix
Infinite scroll is a listing-page design approach seen a lot on widely used apps such as TikTok and Instagram to keep the user engaged, loading additi...
Preventing atom exhaustion attacks with `String.to_existing_atom`
Using String.to_atom/1 on user input is a critical security vulnerability that can crash your entire BEAM VM through atom exhaustion. Here are two app...
Executing OS processes using Elixir Ports
Ports in Elixir provide us an interface for communicating with external processes by sending and receiving messages. They make it easy to start and ma...
copied to clipboard