<?xml version="1.0" encoding="UTF-8"?>
<feed xmlns="http://www.w3.org/2005/Atom" xml:lang="en">
    <id>https://jesseleite.com/feed</id>
    <title type="text">Bag End by Jesse Leite</title>
    <subtitle type="text">Welcome to Bag End! — A microblog for me to share thoughts and musings about things I'm into.</subtitle>
    <link xmlns="http://www.w3.org/2005/Atom" rel="self" type="application/atom+xml" href="https://jesseleite.com/feed"/>
    <updated>2026-03-09T14:09:22+00:00</updated>
    <generator uri="https://github.com/mitydigital/feedamic" version="3.0.9">Feedamic: the Atom and RSS Feed generator for Statamic</generator>
    <entry>
        <title type="text">Clause and Effect</title>
        <link href="https://jesseleite.com/2026/clause-and-effect"/>
        <id>https://jesseleite.com/2026/clause-and-effect</id>
        <published>2026-03-09T00:00:00+00:00</published>
        <updated>2026-03-09T14:02:11+00:00</updated>
        <summary type="text">Wait, you can have multiple function clauses with the same name in Elixir? Let's explore how multi-clause functions, arity, and guard expressions can replace nested conditionals, and why this even matters.</summary>
        <content type="html">&lt;p&gt;At the end of the &lt;a href=&quot;/2026/pattern-match-made-in-heaven&quot;&gt;last post&lt;/a&gt;, I used a &lt;em&gt;multi-clause function&lt;/em&gt; to demonstrate the power of pattern matching in &lt;a href=&quot;https://elixir-lang.org/&quot;&gt;Elixir&lt;/a&gt;. What are multi-clause functions though, and how is this even possible?&lt;/p&gt;
&lt;p&gt;In many languages, a function is defined by name only, and you can only have &lt;em&gt;one function&lt;/em&gt; with a given name per class or namespace.&lt;/p&gt;
&lt;p&gt;For example, if you redeclare the same &lt;code&gt;greet()&lt;/code&gt; function twice in PHP, it will blow up with a &lt;code&gt;FATAL ERROR&lt;/code&gt;:&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-php&quot;&gt;class Message
{
    public function greet(User $user): string
    {
        return &amp;quot;Welcome, {$user-&amp;gt;name}!&amp;quot;;
    }

    public function greet(Contact $contact): string
    {
        return &amp;quot;Welcome, {$contact-&amp;gt;displayName}!&amp;quot;;
    }
}

# FATAL ERROR - Cannot redeclare Message::greet()
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;As we've learned though, Elixir allows for &lt;a href=&quot;/2026/pattern-match-made-in-heaven&quot;&gt;pattern matching&lt;/a&gt; across &lt;em&gt;multiple function clauses&lt;/em&gt; with the same name, where you can define the various &lt;em&gt;shapes&lt;/em&gt; of data that a function can accept:&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-elixir&quot;&gt;defmodule Message do
  def greet(%User{} = user) do
    &amp;quot;Welcome, #{user.name}!&amp;quot;
  end

  def greet(%Contact{} = contact) do
    &amp;quot;Welcome, #{contact.display_name}!&amp;quot;
  end
end
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;This is totally valid Elixir. When calling &lt;code&gt;Message.greet(contact)&lt;/code&gt; with a &lt;code&gt;%Contact{}&lt;/code&gt; struct as an argument, Elixir will use pattern matching to pass over the first &lt;code&gt;%User{}&lt;/code&gt; clause, running the second clause instead.&lt;/p&gt;
&lt;p&gt;As long as the shape of the arguments is distinct enough to pattern match without ambiguity, Elixir will treat both of these as valid compilable function clauses.&lt;/p&gt;
&lt;p&gt;More than just the shape of the arguments, Elixir also considers the &lt;em&gt;number&lt;/em&gt; of arguments in any given function definition. This is called &lt;em&gt;arity&lt;/em&gt;, and you'll often see this referenced as &lt;code&gt;function_name/arity&lt;/code&gt;:&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-elixir&quot;&gt;# This is `greet/1` (because it has one argument)
def greet(%User{} = user) do
  &amp;quot;Welcome, #{user.name}!&amp;quot;
end

# This is `greet/2` (because it has two arguments)
def greet(%User{} = user, %Time{} = time) do
  cond do
    time.hour in 0..11  -&amp;gt; &amp;quot;Good morning, #{user.name}!&amp;quot;
    time.hour in 12..17 -&amp;gt; &amp;quot;Good afternoon, #{user.name}!&amp;quot;
    time.hour in 18..23 -&amp;gt; &amp;quot;Good evening, #{user.name}!&amp;quot;
  end
end
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Now if we call &lt;code&gt;greet(user, time)&lt;/code&gt; with two arguments, Elixir will know to run the second &lt;code&gt;greet/2&lt;/code&gt; clause because of function &lt;em&gt;arity&lt;/em&gt;.&lt;/p&gt;
&lt;p&gt;The important thing to note here is that a function's identity is both its name &lt;em&gt;and&lt;/em&gt; its arity — so &lt;code&gt;greet/1&lt;/code&gt; and &lt;code&gt;greet/2&lt;/code&gt; are totally separate functions, not overloads of the same function. This mainly matters for control flow, but there are more uses for arity which we'll cover in a future post.&lt;/p&gt;
&lt;p&gt;You can see how pattern matching and arity can really clean things up, but what about that nested &lt;code&gt;cond&lt;/code&gt; expression inside my &lt;code&gt;greet/2&lt;/code&gt; clause? If we want to remove a layer of nesting here, we can extract to the top level using &lt;code&gt;when&lt;/code&gt; guard expressions:&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-elixir&quot;&gt;def greet(%User{} = user, %Time{hour: h}) when h in 0..11 do
  &amp;quot;Good morning, #{user.name}!&amp;quot;
end

def greet(%User{} = user, %Time{hour: h}) when h in 12..17 do
  &amp;quot;Good afternoon, #{user.name}!&amp;quot;
end

def greet(%User{} = user, %Time{hour: h}) when h in 18..23 do
  &amp;quot;Good evening, #{user.name}!&amp;quot;
end
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Finally, maybe we also want to have a simple fallback &lt;code&gt;greet/0&lt;/code&gt; clause for when we don't have person or time arguments to pass:&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-elixir&quot;&gt;def greet do
  &amp;quot;Greetings!&amp;quot;
end
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Now why does all of this &lt;em&gt;really&lt;/em&gt; matter? 👀&lt;/p&gt;
&lt;p&gt;In PHP, if you wanted a &lt;code&gt;greet()&lt;/code&gt; function to handle all of the edge cases we've touched on, you would have to get clever with nested conditions and guards &lt;em&gt;inside&lt;/em&gt; your function, maybe something like this:&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-php&quot;&gt;public function greet(User|Contact|null $person = null, ?DateTime $time = null): string
{
    if (! $person) {
        return &amp;quot;Greetings!&amp;quot;;
    }

    $hour = $time?-&amp;gt;format('G');

    if ($time &amp;amp;&amp;amp; $hour &amp;gt;= 0 &amp;amp;&amp;amp; $hour &amp;lt;= 11) {
        $greeting = &amp;quot;Good morning&amp;quot;;
    } elseif ($time &amp;amp;&amp;amp; $hour &amp;gt;= 12 &amp;amp;&amp;amp; $hour &amp;lt;= 17) {
        $greeting = &amp;quot;Good afternoon&amp;quot;;
    } elseif ($time &amp;amp;&amp;amp; $hour &amp;gt;= 18 &amp;amp;&amp;amp; $hour &amp;lt;= 23) {
        $greeting = &amp;quot;Good evening&amp;quot;;
    } else {
        $greeting = &amp;quot;Welcome&amp;quot;;
    }

    if ($person instanceof User) {
        $name = $person-&amp;gt;name;
    } elseif ($person instanceof Contact) {
        $name = $person-&amp;gt;displayName;
    }

    return &amp;quot;{$greeting}, {$name}!&amp;quot;;
}
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;This honestly isn't so bad! You could even clean this up by extracting smaller &lt;code&gt;getGreeting($time)&lt;/code&gt; and &lt;code&gt;getName($person)&lt;/code&gt; helpers, but the complexity of logic required within a single &lt;code&gt;greet()&lt;/code&gt; definition as an entry point remains.&lt;/p&gt;
&lt;p&gt;Elixir, on the other hand, lets you flatten &lt;code&gt;greet()&lt;/code&gt; into simpler, hyperfocused function clauses:&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-elixir&quot;&gt;def greet(person, %Time{hour: h}) when h in 0..11 do
  &amp;quot;Good morning, #{name(person)}!&amp;quot;
end

def greet(person, %Time{hour: h}) when h in 12..17 do
  &amp;quot;Good afternoon, #{name(person)}!&amp;quot;
end

def greet(person, %Time{hour: h}) when h in 18..23 do
  &amp;quot;Good evening, #{name(person)}!&amp;quot;
end

def greet(person) do
  &amp;quot;Welcome, #{name(person)}!&amp;quot;
end

def greet do
  &amp;quot;Greetings!&amp;quot;
end

defp name(%User{} = user) do
  user.name
end

defp name(%Contact{} = contact) do
  contact.display_name
end
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Using all of these multi-clause techniques together (pattern matching, arity, and guard expressions), our clauses are now:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;Easier to read&lt;/li&gt;
&lt;li&gt;Easier to extend&lt;/li&gt;
&lt;li&gt;Easier to test&lt;/li&gt;
&lt;li&gt;Easier for AI to reason about&lt;/li&gt;
&lt;li&gt;More token-efficient for LLMs&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;Don't. Sleep. On. Elixir. 😎&lt;/p&gt;</content>
        <author>
            <name>Jesse Leite</name>
        </author>
    </entry>
    <entry>
        <title type="text">Pattern Match Made in Heaven</title>
        <link href="https://jesseleite.com/2026/pattern-match-made-in-heaven"/>
        <id>https://jesseleite.com/2026/pattern-match-made-in-heaven</id>
        <published>2026-02-28T00:00:00+00:00</published>
        <updated>2025-09-16T02:18:07+00:00</updated>
        <summary type="text">Pattern matching is one of the first things you'll learn in Elixir that might just completely rewire your brain. Let's dig into how it can change the way you handle data, errors, and control flow.</summary>
        <content type="html">&lt;p&gt;In most languages, &lt;code&gt;=&lt;/code&gt; is merely an &lt;em&gt;assignment&lt;/em&gt; operator. In &lt;a href=&quot;https://elixir-lang.org/&quot;&gt;Elixir&lt;/a&gt;, &lt;code&gt;=&lt;/code&gt; is actually called the &lt;em&gt;match operator&lt;/em&gt;, and it's one of the first things you'll learn in Elixir that might just completely rewire your brain!&lt;/p&gt;
&lt;p&gt;Of course, we can still use &lt;code&gt;=&lt;/code&gt; for basic assignment:&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-elixir&quot;&gt;name = &amp;quot;Jesse&amp;quot;
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;But what's actually happening here is that Elixir is &lt;em&gt;matching&lt;/em&gt; the left side against the right side, binding matched variables along the way.&lt;/p&gt;
&lt;p&gt;This becomes powerful when you start matching against more complex data structures:&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-elixir&quot;&gt;{:ok, value} = {:ok, 42}
# value is now 42

{:error, reason} = {:error, &amp;quot;not found&amp;quot;}
# reason is now &amp;quot;not found&amp;quot;
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;This is not unlike basic destructuring in PHP or JS:&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-javascript&quot;&gt;const [status, value] = [&amp;quot;ok&amp;quot;, 42];
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Except in JS, a failed destructure silently gives you &lt;code&gt;undefined&lt;/code&gt;, not to mention both PHP and JS are quite limiting when it comes to what you can do with destructuring.&lt;/p&gt;
&lt;p&gt;Elixir's pattern matching is on a whole different level, because Elixir also &lt;em&gt;asserts the shape&lt;/em&gt;.&lt;/p&gt;
&lt;p&gt;For example, when using the &lt;code&gt;=&lt;/code&gt; match operator, a failed match will blow up with a &lt;code&gt;MatchError&lt;/code&gt;:&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-elixir&quot;&gt;{:ok, value} = {:error, &amp;quot;not found&amp;quot;}
# ** (MatchError) no match of right hand side value: {:error, &amp;quot;not found&amp;quot;}
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Or when pattern matching within &lt;code&gt;case&lt;/code&gt;, &lt;code&gt;cond&lt;/code&gt;, &lt;code&gt;with&lt;/code&gt;, etc., you can branch on possible matches, which can make for some really elegant error handling:&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-elixir&quot;&gt;case Http.get(url) do
  {:ok, %{status: 200, body: body}}
    -&amp;gt; Jason.decode!(body)

  {:error, %{status: 403}}
    -&amp;gt; View.render(:forbidden)

  {:error, %{status: 404}}
    -&amp;gt; View.render(:not_found)

  {:error, _}
    -&amp;gt; Logger.error(&amp;quot;Response failure!&amp;quot;)
end
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;This starts to get really crazy when you realize that you can pattern match &lt;em&gt;nearly anywhere&lt;/em&gt; in Elixir!&lt;/p&gt;
&lt;p&gt;For example, instead of handling branching logic via conditionals within a function's body, you can pattern match right in the definition itself:&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-elixir&quot;&gt;defp response({:ok, %{status: 200, body: body}}) do
  Jason.decode!(body)
end

defp response({:error, %{status: 403}}) do
  View.render(:forbidden)
end

defp response({:error, %{status: 404}}) do
  View.render(:not_found)
end

defp response({:error, _}) do
  Logger.error(&amp;quot;Response failure!&amp;quot;)
end
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Elixir will then check each function clause in order until it finds a pattern match, to determine which clause to run.&lt;/p&gt;
&lt;p&gt;Say we pass the &lt;code&gt;response()&lt;/code&gt; function an &lt;code&gt;{:error, response}&lt;/code&gt; tuple with a &lt;code&gt;response.status&lt;/code&gt; of &lt;code&gt;404&lt;/code&gt;, then our second 'not found' view render clause will run.&lt;/p&gt;
&lt;p&gt;Once you start thinking in patterns, it will fundamentally change how you handle data, errors, and control flow. Instead of writing defensive checks and nesting conditionals, you can often just &lt;em&gt;describe the shape&lt;/em&gt; of the data you expect, and Elixir will do the rest &lt;em&gt;&lt;a href=&quot;https://www.youtube.com/watch?v=Hm3JodBR-vs&quot;&gt;...How neat is that!?&lt;/a&gt;&lt;/em&gt;&lt;/p&gt;</content>
        <author>
            <name>Jesse Leite</name>
        </author>
    </entry>
    <entry>
        <title type="text">The Glorious Pipe Operator</title>
        <link href="https://jesseleite.com/2025/the-glorious-pipe-operator"/>
        <id>https://jesseleite.com/2025/the-glorious-pipe-operator</id>
        <published>2025-09-22T00:00:00+00:00</published>
        <updated>2025-09-16T02:18:07+00:00</updated>
        <summary type="text">Let's talk about how how the functional pipe operator helps to simplify and improve code readability and composability, and how it contrasts with the fluent interface design pattern commonly used in OOP.</summary>
        <content type="html">&lt;p&gt;One of the first game-changing features people learn about in functional programming is the pipe operator, which allows us to pass and transform data fluently through a pipeline.&lt;/p&gt;
&lt;p&gt;In &lt;a href=&quot;https://elixir-lang.org/&quot;&gt;Elixir&lt;/a&gt;, the &lt;code&gt;|&amp;gt;&lt;/code&gt; operator simply takes the &lt;em&gt;result&lt;/em&gt; of an expression on the left side, and passes it as the &lt;em&gt;first argument&lt;/em&gt; to the next function on the right side:&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-elixir&quot;&gt;names |&amp;gt; Enum.sort() |&amp;gt; Enum.uniq()
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;This is essentially equivalent to passing the output of &lt;code&gt;sort()&lt;/code&gt; directly into &lt;code&gt;uniq()&lt;/code&gt;:&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-elixir&quot;&gt;Enum.uniq(Enum.sort(names))
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;The most obvious benefit of the pipeline is that it restructures nested funtions from an inside-out to a much more readable left-to-right, or even top-to-bottom fashion:&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-elixir&quot;&gt;title
|&amp;gt; String.trim()
|&amp;gt; String.downcase()
|&amp;gt; String.replace(&amp;quot; &amp;quot;, &amp;quot;-&amp;quot;)
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;It also eliminates the need for creating temporary variables, and helps with debugging and refactoring, etc.&lt;/p&gt;
&lt;p&gt;If you're coming from Laravel, you're probably familiar with Laravel's fluent collection and string helpers:&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-php&quot;&gt;str($title)
    -&amp;gt;trim()
    -&amp;gt;lower()
    -&amp;gt;replace(&amp;quot; &amp;quot;, &amp;quot;-&amp;quot;)
    -&amp;gt;toString();
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;On the surface, this looks nearly the same as my Elixir example above, but it's actually much more complex under the hood:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;Firstly, &lt;code&gt;str()&lt;/code&gt; creates an &lt;code&gt;Illuminate\Support\Stringable&lt;/code&gt; instance, with the primitive stored on the object.&lt;/li&gt;
&lt;li&gt;At this point, we're only allowed to call methods that exist &lt;em&gt;within&lt;/em&gt; the &lt;code&gt;Stringable&lt;/code&gt; class, like &lt;code&gt;trim()&lt;/code&gt;, &lt;code&gt;lower()&lt;/code&gt;, and &lt;code&gt;replace()&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;To remain fluent, each of these methods must return &lt;code&gt;$this&lt;/code&gt; under the hood.&lt;/li&gt;
&lt;li&gt;At the end of the chain, we're still left with a &lt;code&gt;Stringable&lt;/code&gt; instance, so we need to cast the output to string, or call &lt;code&gt;-&amp;gt;toString()&lt;/code&gt; to get a primitive string as a result.&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;If you've ever tried to built your own fluent API in an object-oriented language like PHP, these concepts will be familiar to you:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;em&gt;&lt;strong&gt;You&lt;/strong&gt;&lt;/em&gt; manage the state on the object yourself.&lt;/li&gt;
&lt;li&gt;&lt;em&gt;&lt;strong&gt;You&lt;/strong&gt;&lt;/em&gt; return &lt;code&gt;$this&lt;/code&gt; from every method.&lt;/li&gt;
&lt;li&gt;&lt;em&gt;&lt;strong&gt;You&lt;/strong&gt;&lt;/em&gt; offer a getter method to grab and/or cast that final state at the end of a pipeline.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;In Elixir, functional pipelines are much simpler, because the &lt;code&gt;|&amp;gt;&lt;/code&gt; operator is implemented at the &lt;em&gt;language level&lt;/em&gt;, and it works on &lt;em&gt;any&lt;/em&gt; function.&lt;/p&gt;
&lt;p&gt;There is no state to manage, the raw output is passed through each step of the pipeline, and no special getter is needed to cast the final result. In fact, you can even pipe functions &lt;em&gt;across modules&lt;/em&gt;!&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-elixir&quot;&gt;csv
|&amp;gt; String.split(&amp;quot;,&amp;quot;)
|&amp;gt; Enum.map(&amp;amp;String.trim/1)
|&amp;gt; Jason.encode()
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;This little functional &lt;code&gt;|&amp;gt;&lt;/code&gt; operator is quite the paradigm shift coming from OOP, and I'm finding that it really helps to simplify and improve code &lt;em&gt;readability and composability.&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;Interestingly, the pipe operator is &lt;a href=&quot;https://wiki.php.net/rfc/pipe-operator-v3&quot;&gt;coming to PHP 8.5&lt;/a&gt;! I have little doubt that the PHP and Laravel communities will be all over it!&lt;/p&gt;</content>
        <author>
            <name>Jesse Leite</name>
        </author>
    </entry>
    <entry>
        <title type="text">Elixir for PHP Devs</title>
        <link href="https://jesseleite.com/2025/elixir-for-php-devs"/>
        <id>https://jesseleite.com/2025/elixir-for-php-devs</id>
        <published>2025-09-16T00:00:00+00:00</published>
        <updated>2025-09-16T02:18:07+00:00</updated>
        <summary type="text">Diving into Elixir has been a blast, and its functional paradigms are challenging the way I think about programming. Join me as I chronicle this journey from the perspective of a long-time OOP dev.</summary>
        <content type="html">&lt;p&gt;Diving into &lt;a href=&quot;https://elixir-lang.org/&quot;&gt;Elixir&lt;/a&gt; has been a blast so far! Its functional paradigms are challenging the way I think about programming, and are a big reason why I'm excited to start blogging again.&lt;/p&gt;
&lt;p&gt;I may not have the expertise to teach Elixir, but I have a career of experience in object-oriented programming, and I think it would be fun to approach this series of posts from that vantage point!&lt;/p&gt;
&lt;p&gt;For starts, I would like to cover Elixir's &lt;em&gt;functional programming&lt;/em&gt; concepts. Let's talk about Elixir's language features, and how they contrast with PHP as an OOP language.&lt;/p&gt;
&lt;p&gt;Next, I'd like to dive into how running on the &lt;a href=&quot;https://www.erlang.org/&quot;&gt;Erlang VM&lt;/a&gt; platform makes Elixir extremely scalable and fault tolerant.&lt;/p&gt;
&lt;p&gt;Finally, as a long-time Laravel dev, I'll no doubt want to chronicle my journey with &lt;a href=&quot;https://www.phoenixframework.org/&quot;&gt;Phoenix&lt;/a&gt; from a Laravel perspective. I'm sure many Rails devs have made this jump given Elixir's history with Ruby, but I haven't seen much crossover into Elixir from the PHP world, and think that angle could be interesting.&lt;/p&gt;
&lt;p&gt;Wherever you come from though, my goal is to infect you with that sweet functional Elixir-pilled excitement. &lt;em&gt;Let's do this!&lt;/em&gt;&lt;/p&gt;</content>
        <author>
            <name>Jesse Leite</name>
        </author>
    </entry>
    <entry>
        <title type="text">A New Chapter</title>
        <link href="https://jesseleite.com/2025/a-new-chapter"/>
        <id>https://jesseleite.com/2025/a-new-chapter</id>
        <published>2025-09-14T00:00:00+00:00</published>
        <updated>2025-09-15T03:10:20+00:00</updated>
        <summary type="text">In a recent turn of events, I find myself at a bit of a crossroads with an exciting new job on the horizon! In this post, I introduce myself and discuss my vision for the new blog.</summary>
        <content type="html">&lt;p&gt;Hello and welcome!&lt;/p&gt;
&lt;p&gt;My name is Jesse Leite, and I am a software developer from Ontario, Canada. In a recent turn of events, I find myself at a bit of a crossroads with an exciting new job on the horizon...&lt;/p&gt;
&lt;div class=&quot;media&quot;&gt;
    &lt;blockquote class=&quot;twitter-tweet&quot;&gt;&lt;p lang=&quot;en&quot; dir=&quot;ltr&quot;&gt;Incredibly excited to share that today I officially accepted a new job offer and position at &lt;a href=&quot;https://twitter.com/savvycal?ref_src=twsrc%5Etfw&quot;&gt;@savvycal&lt;/a&gt;! 🙏&lt;br&gt;&lt;br&gt;Super rad product, and neat tech stack too! Elixir + Phoenix + Inertia + React, lessssgo! 💪 &lt;a href=&quot;https://t.co/s0ows8CIPj&quot;&gt;https://t.co/s0ows8CIPj&lt;/a&gt;&lt;/p&gt;&amp;mdash; Dr. Elvim Ransom 👽 (@jesseleite85) &lt;a href=&quot;https://twitter.com/jesseleite85/status/1965539747042132369?ref_src=twsrc%5Etfw&quot;&gt;September 9, 2025&lt;/a&gt;&lt;/blockquote&gt; &lt;script async src=&quot;https://platform.twitter.com/widgets.js&quot; charset=&quot;utf-8&quot;&gt;&lt;/script&gt;
&lt;/div&gt;
&lt;p&gt;Of course, this is a very bittersweet move after being at &lt;a href=&quot;https://statamic.com&quot;&gt;Statamic&lt;/a&gt; for the last 7 years. I'm very grateful for all the kindness that team and community have shown me over the years. That said, I'm beyond excited to be joining the &lt;a href=&quot;https://savvycal.com/home&quot;&gt;SavvyCal&lt;/a&gt; team!&lt;/p&gt;
&lt;p&gt;After having spent the last ~10 years of my professional life in Laravel and Vue, I figure this new chapter will be a perfect opportunity to try blogging again as I hop ecosystems and dive into the new Elixir + React stack. For example, expect nuggets about my functional programming learnings as a long-time OOP dev!&lt;/p&gt;
&lt;p&gt;Outside of all that, I'm also a husband, proud father, Christ follower, and all-around flawed human being. I enjoy music, reading, gaming, and sometimes even going outdoors! I may blog about some of these topics from time to time, but it'll mostly be focused around software and dev.&lt;/p&gt;
&lt;p&gt;In order to make things easy on myself, I'm going to treat this as a microblog of sorts. Instead of long posts and in-depth tutorials, I hope to publish more bite-sized thoughts and musings to keep things regular. &lt;em&gt;Short and sweet!&lt;/em&gt;&lt;/p&gt;</content>
        <author>
            <name>Jesse Leite</name>
        </author>
    </entry>
</feed>
