Peter Ullrich's Picture

Hey, I’m Peter! Developer & Educator.

I'm a Senior Elixir developer with a Psychology background, PragProg Author, Public Speaker and Blogger, and Founder. I'm passionate about Software Architecture, Product Engineering, and sharing knowledge.

Products

The book cover of the Builting Table Views with Phoenix LiveView book showing three meerkats.

Building Table Views with Phoenix LiveView

Data is at the core of every business, but it is useless if nobody can access it. This book shows you how to generate business value by making your data accessible with advanced table UIs.
The book cover of the Builting Table Views with Phoenix LiveView book showing three meerkats.

Build an MVP with Elixir

New to Elixir? This video course gets you started by developing a real-world product using Phoenix LiveView, deploying it to Fly.io, adding payments to it using LemonSqueezy, and more.
The book cover of the Builting Table Views with Phoenix LiveView book showing three meerkats.

Building Forms with Phoenix LiveView

Creating forms in LiveView is easy - until it's not. This course teaches you how to build forms like a pro and to avoid the pitfalls along the way.

Blog Posts

A wizard riding a phoenix into the blue skies.

A Bluesky Starter Guide for Elixir Devs

Join the Elixir community on Bluesky. Learn account setup, find peers, and smoothly transition from X. Key steps for efficient migration.

A phoenix mocking a wizard in his library.

Easy Mocking in Elixir

Quick, dependency-free mocking in Elixir tests. Learn how to configure your mock once and use it everywhere. Simple and effective for all test suites.

A wizard sitting on a comfy couch chair while reading a Saga from a book to a Phoenix.

The Saga Pattern in Elixir

Explore the Saga pattern in Elixir for managing complex, multi-step processes. Learn about choreography and orchestration approaches, with code examples for implementing long-lived transactions.

A phoenix rising from its ashes.

Resurrect your Phoenix Context

A retraction: I changed my mind about Phoenix contexts. Here's how I structure my Elixir code with a simpler, more effective design in the true functional way.

An elderly wizard, looking desperate as he tries to block out the intense singing of the phoenix. The scene captures his overwhelming distress in a vivid and colorful setting.

Handle Phoenix Exceptions gracefully

Silence the noisy Phoenix.NotAcceptableError and Plug.CSRFProtection.InvalidCSRFTokenError exceptions in your Phoenix application by implementing the Plug.Exception protocol for them.

An image of a vibrant phoenix positioned behind the planet Earth, hurling files at different regions on the globe. Each file has a streak behind it, and explosions are shown where the files hit the globe.

Distribute your Files Globally with Tigris and Fly.io

Serve your files quickly to users all around the globe with just a small configuration change using Tigris' globally distributed S3-compatible storage solution.

A wizard sending an image into a cloud, with a rainbow in the background and a phoenix sitting next to the wizard.

Resize User-provided Images with Cloudflare Images

Learn how to upload user-provided images to Cloudflare Images and to resize them into size variants that are optimal for your application.

a wizard sending an owl with a letter through the window.

Sending Emails with Swoosh and Oban

Learn how to send emails from robust Oban workers so that you'll never miss sending an email again.

A wizard wearing a flaming halo as a crown on his head, with a majestic phoenix in the background and a hat hanging on the wall. The scene captures a mystical and awe-inspiring atmosphere.

Every Ending is a new Beginning

Announcing my departure from employment life and the start of my freelancing and entrepreneurship life. At least until further notice.

A wizard catching an elephant that flies through the air, forest landscape in the background, digital art

Test an external, read-only Repository in Phoenix

When your application connects to an external database in read-only mode, it becomes difficult to write proper tests for it. This post explains how to set up a simulated external database locally to make testing becomes easy again.