<?xml version="1.0" encoding="UTF-8"?>
<feed xmlns="http://www.w3.org/2005/Atom" xml:lang="en">
    <id>https://srwiez.com/feed/atom</id>
    <title type="text">Eser DENIZ / @SRWieZ</title>
    <subtitle type="text">Welcome to my dev blog ! Here you will find all of my finding, even the smallest ones. I'm using this place like journal so I hope this will help you!</subtitle>
    <link xmlns="http://www.w3.org/2005/Atom" rel="self" type="application/atom+xml" href="https://srwiez.com/feed/atom"/>
    <updated>2026-10-30T15:47:46+00:00</updated>
    <generator uri="https://github.com/mitydigital/feedamic" version="3.0.13">Feedamic: the Atom and RSS Feed generator for Statamic</generator>
    <entry>
        <title type="text">Linux suspend on a T2 MacBook Pro: what actually worked</title>
        <link href="https://srwiez.com/posts/linux-suspend-on-a-t2-macbook-pro-what-actually-worked"/>
        <id>https://srwiez.com/posts/linux-suspend-on-a-t2-macbook-pro-what-actually-worked</id>
        <published>2026-07-15T00:00:00+00:00</published>
        <updated>2026-07-15T14:45:43+00:00</updated>
        <summary type="text">&lt;p&gt;I recently installed CachyOS on my 2020 Intel MacBook Pro. Almost everything worked surprisingly well. Then I closed the lid.&lt;/p&gt;
&lt;!--more--&gt;
&lt;p&gt;The Mac went to sleep, the screen turned black, and it never came back. The Touch Bar sometimes lit up, but the display, keyboard, trackpad and network stayed dead. The only option was holding the power button and forcing a reboot.&lt;/p&gt;
&lt;p&gt;This MacBook is a &lt;code&gt;MacBookPro16,2&lt;/code&gt; with Apple's T2 chip. Linux support is much better than it used to be, but suspend is still complicated.&lt;/p&gt;
&lt;ul class=&quot;table-of-contents not-prose&quot;&gt;
&lt;li&gt;&lt;a href=&quot;#content-what-i-tried&quot;&gt;What I tried&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;#content-trying-t2bce&quot;&gt;Trying t2bce&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;#content-hibernate-did-not-save-me&quot;&gt;Hibernate did not save me&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;#content-what-actually-works&quot;&gt;What actually works&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;#content-the-conclusion&quot;&gt;The conclusion&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;&lt;a id=&quot;content-what-i-tried&quot; href=&quot;#content-what-i-tried&quot; class=&quot;heading-permalink&quot; aria-hidden=&quot;true&quot; tabindex=&quot;-1&quot; title=&quot;Permalink&quot;&gt;#&lt;/a&gt;What I tried&lt;/h2&gt;
&lt;p&gt;I tested both sleep modes available on the machine:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;deep&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;s2idle&lt;/code&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Both failed.&lt;/p&gt;
&lt;p&gt;I then tried the older T2Linux workaround that unloads &lt;code&gt;apple_bce&lt;/code&gt; before sleep and reloads it after resume. It did not help.&lt;/p&gt;
&lt;p&gt;My CachyOS kernel already included the newer &lt;code&gt;apple_bce&lt;/code&gt; no-state suspend implementation, so I removed the old workaround and tested the native path with &lt;code&gt;pm_async=off&lt;/code&gt;. This was promising because other &lt;code&gt;MacBookPro16,2&lt;/code&gt; users reported successful resume with it.&lt;/p&gt;
&lt;p&gt;Mine still froze.&lt;/p&gt;
&lt;h2&gt;&lt;a id=&quot;content-trying-t2bce&quot; href=&quot;#content-trying-t2bce&quot; class=&quot;heading-permalink&quot; aria-hidden=&quot;true&quot; tabindex=&quot;-1&quot; title=&quot;Permalink&quot;&gt;#&lt;/a&gt;Trying t2bce&lt;/h2&gt;
&lt;p&gt;The most interesting modern option is &lt;a href=&quot;https://github.com/deqrocks/t2bce&quot;&gt;t2bce&lt;/a&gt;, a new replacement for the old &lt;code&gt;apple_bce&lt;/code&gt; driver.&lt;/p&gt;
&lt;p&gt;I built version &lt;code&gt;0.06&lt;/code&gt; directly against the CachyOS kernel. Because CachyOS uses a Clang/LTO kernel, I had to build it with:&lt;/p&gt;
&lt;div x-data=&quot;codeBlock&quot; class=&quot;code-block relative&quot;&gt;&lt;div class=&quot;flex space-x-2 items-center absolute top-0 right-0&quot;&gt;
    &lt;div x-cloak x-show=&quot;showMessage&quot; x-transition class=&quot;py-2 animate-bounce transition duration-300 mt-1 text-sky-500 text-xs&quot;&gt;Copied!&lt;/div&gt;
    &lt;button
        type=&quot;button&quot;
        title=&quot;Copy to clipboard&quot;
        class=&quot;hidden sm:block p-2 pl-3 transition duration-300&quot;
        @click.prevent=&quot;copyToClipboard&quot;
        :class=&quot;{
            'text-black/30 hover:text-black/80': !showMessage,
            'text-sky-500 hover:text-sky-700': showMessage,
        }&quot;&gt;
        &lt;svg xmlns=&quot;http://www.w3.org/2000/svg&quot; fill=&quot;none&quot; viewBox=&quot;0 0 24 24&quot; stroke-width=&quot;1.5&quot; stroke=&quot;currentColor&quot; class=&quot;block w-6 h-6&quot;&gt;
            &lt;path fill=&quot;white&quot; stroke-linecap=&quot;round&quot; stroke-linejoin=&quot;round&quot; d=&quot;M11.35 3.836c-.065.21-.1.433-.1.664 0 .414.336.75.75.75h4.5a.75.75 0 00.75-.75 2.25 2.25 0 00-.1-.664m-5.8 0A2.251 2.251 0 0113.5 2.25H15c1.012 0 1.867.668 2.15 1.586m-5.8 0c-.376.023-.75.05-1.124.08C9.095 4.01 8.25 4.973 8.25 6.108V8.25m8.9-4.414c.376.023.75.05 1.124.08 1.131.094 1.976 1.057 1.976 2.192V16.5A2.25 2.25 0 0118 18.75h-2.25m-7.5-10.5H4.875c-.621 0-1.125.504-1.125 1.125v11.25c0 .621.504 1.125 1.125 1.125h9.75c.621 0 1.125-.504 1.125-1.125V18.75m-7.5-10.5h6.375c.621 0 1.125.504 1.125 1.125v9.375m-8.25-3l1.5 1.5 3-3.75&quot; /&gt;
        &lt;/svg&gt;
    &lt;/button&gt;
&lt;/div&gt;&lt;pre class=&quot;phiki language-shellscript github-light&quot; data-language=&quot;shellscript&quot; style=&quot;background-color: #fff;color: #24292e;&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;token&quot; style=&quot;color: #6f42c1;&quot;&gt;make&lt;/span&gt;&lt;span class=&quot;token&quot;&gt; &lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #032f62;&quot;&gt;LLVM=&lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #005cc5;&quot;&gt;1&lt;/span&gt;&lt;span class=&quot;token&quot;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;I installed its four modules and created a one-time GRUB entry that disabled &lt;code&gt;apple_bce&lt;/code&gt;. This gave me a safe fallback if the experimental boot failed.&lt;/p&gt;
&lt;p&gt;The result was impressive at first. CachyOS booted normally and t2bce restored everything:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Internal keyboard and trackpad&lt;/li&gt;
&lt;li&gt;Touch Bar&lt;/li&gt;
&lt;li&gt;Audio&lt;/li&gt;
&lt;li&gt;Wi-Fi&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Unfortunately, real deep suspend still failed to resume and required another forced reboot.&lt;/p&gt;
&lt;h2&gt;&lt;a id=&quot;content-hibernate-did-not-save-me&quot; href=&quot;#content-hibernate-did-not-save-me&quot; class=&quot;heading-permalink&quot; aria-hidden=&quot;true&quot; tabindex=&quot;-1&quot; title=&quot;Permalink&quot;&gt;#&lt;/a&gt;Hibernate did not save me&lt;/h2&gt;
&lt;p&gt;My next idea was hibernation.&lt;/p&gt;
&lt;p&gt;I created a dedicated 20 GB Btrfs swapfile, configured the correct resume offset, and verified that systemd could detect it. The Mac went dark, but did not wake normally. After a forced reboot, Linux reported that no valid hibernation image could be restored.&lt;/p&gt;
&lt;p&gt;I also tried systemd's &lt;code&gt;test_resume&lt;/code&gt; mode. That froze too.&lt;/p&gt;
&lt;p&gt;At that point, suspend and hibernate had both exhausted enough of my patience.&lt;/p&gt;
&lt;h2&gt;&lt;a id=&quot;content-what-actually-works&quot; href=&quot;#content-what-actually-works&quot; class=&quot;heading-permalink&quot; aria-hidden=&quot;true&quot; tabindex=&quot;-1&quot; title=&quot;Permalink&quot;&gt;#&lt;/a&gt;What actually works&lt;/h2&gt;
&lt;p&gt;I stopped trying to make the Mac sleep.&lt;/p&gt;
&lt;p&gt;My final lid configuration is simple:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Closing the lid locks KDE&lt;/li&gt;
&lt;li&gt;The display turns off after five seconds&lt;/li&gt;
&lt;li&gt;Automatic suspend is disabled&lt;/li&gt;
&lt;li&gt;Opening the lid immediately shows the locked session&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;I also added a systemd-logind fallback:&lt;/p&gt;
&lt;div x-data=&quot;codeBlock&quot; class=&quot;code-block relative&quot;&gt;&lt;div class=&quot;flex space-x-2 items-center absolute top-0 right-0&quot;&gt;
    &lt;div x-cloak x-show=&quot;showMessage&quot; x-transition class=&quot;py-2 animate-bounce transition duration-300 mt-1 text-sky-500 text-xs&quot;&gt;Copied!&lt;/div&gt;
    &lt;button
        type=&quot;button&quot;
        title=&quot;Copy to clipboard&quot;
        class=&quot;hidden sm:block p-2 pl-3 transition duration-300&quot;
        @click.prevent=&quot;copyToClipboard&quot;
        :class=&quot;{
            'text-black/30 hover:text-black/80': !showMessage,
            'text-sky-500 hover:text-sky-700': showMessage,
        }&quot;&gt;
        &lt;svg xmlns=&quot;http://www.w3.org/2000/svg&quot; fill=&quot;none&quot; viewBox=&quot;0 0 24 24&quot; stroke-width=&quot;1.5&quot; stroke=&quot;currentColor&quot; class=&quot;block w-6 h-6&quot;&gt;
            &lt;path fill=&quot;white&quot; stroke-linecap=&quot;round&quot; stroke-linejoin=&quot;round&quot; d=&quot;M11.35 3.836c-.065.21-.1.433-.1.664 0 .414.336.75.75.75h4.5a.75.75 0 00.75-.75 2.25 2.25 0 00-.1-.664m-5.8 0A2.251 2.251 0 0113.5 2.25H15c1.012 0 1.867.668 2.15 1.586m-5.8 0c-.376.023-.75.05-1.124.08C9.095 4.01 8.25 4.973 8.25 6.108V8.25m8.9-4.414c.376.023.75.05 1.124.08 1.131.094 1.976 1.057 1.976 2.192V16.5A2.25 2.25 0 0118 18.75h-2.25m-7.5-10.5H4.875c-.621 0-1.125.504-1.125 1.125v11.25c0 .621.504 1.125 1.125 1.125h9.75c.621 0 1.125-.504 1.125-1.125V18.75m-7.5-10.5h6.375c.621 0 1.125.504 1.125 1.125v9.375m-8.25-3l1.5 1.5 3-3.75&quot; /&gt;
        &lt;/svg&gt;
    &lt;/button&gt;
&lt;/div&gt;&lt;pre class=&quot;phiki language-ini github-light&quot; data-language=&quot;ini&quot; style=&quot;background-color: #fff;color: #24292e;&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;token&quot; style=&quot;color: #6f42c1;&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #6f42c1;&quot;&gt;Login&lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #6f42c1;&quot;&gt;]&lt;/span&gt;&lt;span class=&quot;token&quot;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;token&quot; style=&quot;color: #d73a49;&quot;&gt;HandleLidSwitch&lt;/span&gt;&lt;span class=&quot;token&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;token&quot;&gt;lock
&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;token&quot; style=&quot;color: #d73a49;&quot;&gt;HandleLidSwitchExternalPower&lt;/span&gt;&lt;span class=&quot;token&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;token&quot;&gt;lock
&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;token&quot; style=&quot;color: #d73a49;&quot;&gt;HandleLidSwitchDocked&lt;/span&gt;&lt;span class=&quot;token&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;token&quot;&gt;ignore
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;Plasma's PowerDevil normally handles the lid event, but this ensures that logind never falls back to suspend when the desktop session is unavailable.&lt;/p&gt;
&lt;p&gt;It is not real sleep, so it still uses battery. But it is predictable, instant and does not corrupt my session with forced shutdowns.&lt;/p&gt;
&lt;h2&gt;&lt;a id=&quot;content-the-conclusion&quot; href=&quot;#content-the-conclusion&quot; class=&quot;heading-permalink&quot; aria-hidden=&quot;true&quot; tabindex=&quot;-1&quot; title=&quot;Permalink&quot;&gt;#&lt;/a&gt;The conclusion&lt;/h2&gt;
&lt;p&gt;Linux on a T2 MacBook is now good enough to use every day, but sleep remains very dependent on the exact model, firmware and kernel.&lt;/p&gt;
&lt;p&gt;&lt;code&gt;t2bce&lt;/code&gt; is promising and I will keep watching it. For now, the reliable solution on my &lt;code&gt;MacBookPro16,2&lt;/code&gt; is not another suspend patch. It is accepting that the machine should stay awake when the lid is closed.&lt;/p&gt;
&lt;p&gt;Not perfect, but it works every time.&lt;/p&gt;</summary>
        <content type="html">&lt;p&gt;I recently installed CachyOS on my 2020 Intel MacBook Pro. Almost everything worked surprisingly well. Then I closed the lid.&lt;/p&gt;
&lt;!--more--&gt;
&lt;p&gt;The Mac went to sleep, the screen turned black, and it never came back. The Touch Bar sometimes lit up, but the display, keyboard, trackpad and network stayed dead. The only option was holding the power button and forcing a reboot.&lt;/p&gt;
&lt;p&gt;This MacBook is a &lt;code&gt;MacBookPro16,2&lt;/code&gt; with Apple's T2 chip. Linux support is much better than it used to be, but suspend is still complicated.&lt;/p&gt;
&lt;ul class=&quot;table-of-contents not-prose&quot;&gt;
&lt;li&gt;&lt;a href=&quot;#content-what-i-tried&quot;&gt;What I tried&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;#content-trying-t2bce&quot;&gt;Trying t2bce&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;#content-hibernate-did-not-save-me&quot;&gt;Hibernate did not save me&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;#content-what-actually-works&quot;&gt;What actually works&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;#content-the-conclusion&quot;&gt;The conclusion&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;&lt;a id=&quot;content-what-i-tried&quot; href=&quot;#content-what-i-tried&quot; class=&quot;heading-permalink&quot; aria-hidden=&quot;true&quot; tabindex=&quot;-1&quot; title=&quot;Permalink&quot;&gt;#&lt;/a&gt;What I tried&lt;/h2&gt;
&lt;p&gt;I tested both sleep modes available on the machine:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;deep&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;s2idle&lt;/code&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Both failed.&lt;/p&gt;
&lt;p&gt;I then tried the older T2Linux workaround that unloads &lt;code&gt;apple_bce&lt;/code&gt; before sleep and reloads it after resume. It did not help.&lt;/p&gt;
&lt;p&gt;My CachyOS kernel already included the newer &lt;code&gt;apple_bce&lt;/code&gt; no-state suspend implementation, so I removed the old workaround and tested the native path with &lt;code&gt;pm_async=off&lt;/code&gt;. This was promising because other &lt;code&gt;MacBookPro16,2&lt;/code&gt; users reported successful resume with it.&lt;/p&gt;
&lt;p&gt;Mine still froze.&lt;/p&gt;
&lt;h2&gt;&lt;a id=&quot;content-trying-t2bce&quot; href=&quot;#content-trying-t2bce&quot; class=&quot;heading-permalink&quot; aria-hidden=&quot;true&quot; tabindex=&quot;-1&quot; title=&quot;Permalink&quot;&gt;#&lt;/a&gt;Trying t2bce&lt;/h2&gt;
&lt;p&gt;The most interesting modern option is &lt;a href=&quot;https://github.com/deqrocks/t2bce&quot;&gt;t2bce&lt;/a&gt;, a new replacement for the old &lt;code&gt;apple_bce&lt;/code&gt; driver.&lt;/p&gt;
&lt;p&gt;I built version &lt;code&gt;0.06&lt;/code&gt; directly against the CachyOS kernel. Because CachyOS uses a Clang/LTO kernel, I had to build it with:&lt;/p&gt;
&lt;div x-data=&quot;codeBlock&quot; class=&quot;code-block relative&quot;&gt;&lt;div class=&quot;flex space-x-2 items-center absolute top-0 right-0&quot;&gt;
    &lt;div x-cloak x-show=&quot;showMessage&quot; x-transition class=&quot;py-2 animate-bounce transition duration-300 mt-1 text-sky-500 text-xs&quot;&gt;Copied!&lt;/div&gt;
    &lt;button
        type=&quot;button&quot;
        title=&quot;Copy to clipboard&quot;
        class=&quot;hidden sm:block p-2 pl-3 transition duration-300&quot;
        @click.prevent=&quot;copyToClipboard&quot;
        :class=&quot;{
            'text-black/30 hover:text-black/80': !showMessage,
            'text-sky-500 hover:text-sky-700': showMessage,
        }&quot;&gt;
        &lt;svg xmlns=&quot;http://www.w3.org/2000/svg&quot; fill=&quot;none&quot; viewBox=&quot;0 0 24 24&quot; stroke-width=&quot;1.5&quot; stroke=&quot;currentColor&quot; class=&quot;block w-6 h-6&quot;&gt;
            &lt;path fill=&quot;white&quot; stroke-linecap=&quot;round&quot; stroke-linejoin=&quot;round&quot; d=&quot;M11.35 3.836c-.065.21-.1.433-.1.664 0 .414.336.75.75.75h4.5a.75.75 0 00.75-.75 2.25 2.25 0 00-.1-.664m-5.8 0A2.251 2.251 0 0113.5 2.25H15c1.012 0 1.867.668 2.15 1.586m-5.8 0c-.376.023-.75.05-1.124.08C9.095 4.01 8.25 4.973 8.25 6.108V8.25m8.9-4.414c.376.023.75.05 1.124.08 1.131.094 1.976 1.057 1.976 2.192V16.5A2.25 2.25 0 0118 18.75h-2.25m-7.5-10.5H4.875c-.621 0-1.125.504-1.125 1.125v11.25c0 .621.504 1.125 1.125 1.125h9.75c.621 0 1.125-.504 1.125-1.125V18.75m-7.5-10.5h6.375c.621 0 1.125.504 1.125 1.125v9.375m-8.25-3l1.5 1.5 3-3.75&quot; /&gt;
        &lt;/svg&gt;
    &lt;/button&gt;
&lt;/div&gt;&lt;pre class=&quot;phiki language-shellscript github-light&quot; data-language=&quot;shellscript&quot; style=&quot;background-color: #fff;color: #24292e;&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;token&quot; style=&quot;color: #6f42c1;&quot;&gt;make&lt;/span&gt;&lt;span class=&quot;token&quot;&gt; &lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #032f62;&quot;&gt;LLVM=&lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #005cc5;&quot;&gt;1&lt;/span&gt;&lt;span class=&quot;token&quot;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;I installed its four modules and created a one-time GRUB entry that disabled &lt;code&gt;apple_bce&lt;/code&gt;. This gave me a safe fallback if the experimental boot failed.&lt;/p&gt;
&lt;p&gt;The result was impressive at first. CachyOS booted normally and t2bce restored everything:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Internal keyboard and trackpad&lt;/li&gt;
&lt;li&gt;Touch Bar&lt;/li&gt;
&lt;li&gt;Audio&lt;/li&gt;
&lt;li&gt;Wi-Fi&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Unfortunately, real deep suspend still failed to resume and required another forced reboot.&lt;/p&gt;
&lt;h2&gt;&lt;a id=&quot;content-hibernate-did-not-save-me&quot; href=&quot;#content-hibernate-did-not-save-me&quot; class=&quot;heading-permalink&quot; aria-hidden=&quot;true&quot; tabindex=&quot;-1&quot; title=&quot;Permalink&quot;&gt;#&lt;/a&gt;Hibernate did not save me&lt;/h2&gt;
&lt;p&gt;My next idea was hibernation.&lt;/p&gt;
&lt;p&gt;I created a dedicated 20 GB Btrfs swapfile, configured the correct resume offset, and verified that systemd could detect it. The Mac went dark, but did not wake normally. After a forced reboot, Linux reported that no valid hibernation image could be restored.&lt;/p&gt;
&lt;p&gt;I also tried systemd's &lt;code&gt;test_resume&lt;/code&gt; mode. That froze too.&lt;/p&gt;
&lt;p&gt;At that point, suspend and hibernate had both exhausted enough of my patience.&lt;/p&gt;
&lt;h2&gt;&lt;a id=&quot;content-what-actually-works&quot; href=&quot;#content-what-actually-works&quot; class=&quot;heading-permalink&quot; aria-hidden=&quot;true&quot; tabindex=&quot;-1&quot; title=&quot;Permalink&quot;&gt;#&lt;/a&gt;What actually works&lt;/h2&gt;
&lt;p&gt;I stopped trying to make the Mac sleep.&lt;/p&gt;
&lt;p&gt;My final lid configuration is simple:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Closing the lid locks KDE&lt;/li&gt;
&lt;li&gt;The display turns off after five seconds&lt;/li&gt;
&lt;li&gt;Automatic suspend is disabled&lt;/li&gt;
&lt;li&gt;Opening the lid immediately shows the locked session&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;I also added a systemd-logind fallback:&lt;/p&gt;
&lt;div x-data=&quot;codeBlock&quot; class=&quot;code-block relative&quot;&gt;&lt;div class=&quot;flex space-x-2 items-center absolute top-0 right-0&quot;&gt;
    &lt;div x-cloak x-show=&quot;showMessage&quot; x-transition class=&quot;py-2 animate-bounce transition duration-300 mt-1 text-sky-500 text-xs&quot;&gt;Copied!&lt;/div&gt;
    &lt;button
        type=&quot;button&quot;
        title=&quot;Copy to clipboard&quot;
        class=&quot;hidden sm:block p-2 pl-3 transition duration-300&quot;
        @click.prevent=&quot;copyToClipboard&quot;
        :class=&quot;{
            'text-black/30 hover:text-black/80': !showMessage,
            'text-sky-500 hover:text-sky-700': showMessage,
        }&quot;&gt;
        &lt;svg xmlns=&quot;http://www.w3.org/2000/svg&quot; fill=&quot;none&quot; viewBox=&quot;0 0 24 24&quot; stroke-width=&quot;1.5&quot; stroke=&quot;currentColor&quot; class=&quot;block w-6 h-6&quot;&gt;
            &lt;path fill=&quot;white&quot; stroke-linecap=&quot;round&quot; stroke-linejoin=&quot;round&quot; d=&quot;M11.35 3.836c-.065.21-.1.433-.1.664 0 .414.336.75.75.75h4.5a.75.75 0 00.75-.75 2.25 2.25 0 00-.1-.664m-5.8 0A2.251 2.251 0 0113.5 2.25H15c1.012 0 1.867.668 2.15 1.586m-5.8 0c-.376.023-.75.05-1.124.08C9.095 4.01 8.25 4.973 8.25 6.108V8.25m8.9-4.414c.376.023.75.05 1.124.08 1.131.094 1.976 1.057 1.976 2.192V16.5A2.25 2.25 0 0118 18.75h-2.25m-7.5-10.5H4.875c-.621 0-1.125.504-1.125 1.125v11.25c0 .621.504 1.125 1.125 1.125h9.75c.621 0 1.125-.504 1.125-1.125V18.75m-7.5-10.5h6.375c.621 0 1.125.504 1.125 1.125v9.375m-8.25-3l1.5 1.5 3-3.75&quot; /&gt;
        &lt;/svg&gt;
    &lt;/button&gt;
&lt;/div&gt;&lt;pre class=&quot;phiki language-ini github-light&quot; data-language=&quot;ini&quot; style=&quot;background-color: #fff;color: #24292e;&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;token&quot; style=&quot;color: #6f42c1;&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #6f42c1;&quot;&gt;Login&lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #6f42c1;&quot;&gt;]&lt;/span&gt;&lt;span class=&quot;token&quot;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;token&quot; style=&quot;color: #d73a49;&quot;&gt;HandleLidSwitch&lt;/span&gt;&lt;span class=&quot;token&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;token&quot;&gt;lock
&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;token&quot; style=&quot;color: #d73a49;&quot;&gt;HandleLidSwitchExternalPower&lt;/span&gt;&lt;span class=&quot;token&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;token&quot;&gt;lock
&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;token&quot; style=&quot;color: #d73a49;&quot;&gt;HandleLidSwitchDocked&lt;/span&gt;&lt;span class=&quot;token&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;token&quot;&gt;ignore
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;Plasma's PowerDevil normally handles the lid event, but this ensures that logind never falls back to suspend when the desktop session is unavailable.&lt;/p&gt;
&lt;p&gt;It is not real sleep, so it still uses battery. But it is predictable, instant and does not corrupt my session with forced shutdowns.&lt;/p&gt;
&lt;h2&gt;&lt;a id=&quot;content-the-conclusion&quot; href=&quot;#content-the-conclusion&quot; class=&quot;heading-permalink&quot; aria-hidden=&quot;true&quot; tabindex=&quot;-1&quot; title=&quot;Permalink&quot;&gt;#&lt;/a&gt;The conclusion&lt;/h2&gt;
&lt;p&gt;Linux on a T2 MacBook is now good enough to use every day, but sleep remains very dependent on the exact model, firmware and kernel.&lt;/p&gt;
&lt;p&gt;&lt;code&gt;t2bce&lt;/code&gt; is promising and I will keep watching it. For now, the reliable solution on my &lt;code&gt;MacBookPro16,2&lt;/code&gt; is not another suspend patch. It is accepting that the machine should stay awake when the lid is closed.&lt;/p&gt;
&lt;p&gt;Not perfect, but it works every time.&lt;/p&gt;</content>
        <author>
            <name>Eser DENIZ</name>
        </author>
    </entry>
    <entry>
        <title type="text">Is Starlink Worth It? My Switch to Better Alternatives</title>
        <link href="https://srwiez.com/posts/is-starlink-worth-it-my-switch-to-better-alternatives"/>
        <id>https://srwiez.com/posts/is-starlink-worth-it-my-switch-to-better-alternatives</id>
        <published>2026-05-25T00:00:00+00:00</published>
        <updated>2026-05-25T11:14:18+00:00</updated>
        <summary type="text">&lt;p&gt;I had Starlink on the van for a while. It was great. I just cancelled it and went back to a SIM card in a 5G router. Here is why.&lt;/p&gt;
&lt;!--more--&gt;
&lt;ul class=&quot;table-of-contents not-prose&quot;&gt;
&lt;li&gt;&lt;a href=&quot;#content-life-before-starlink&quot;&gt;Life before Starlink&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;#content-why-i-tried-starlink&quot;&gt;Why I tried Starlink&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;#content-the-problems-piled-up&quot;&gt;The problems piled up&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;#content-my-savior-forfait-free-max--20month&quot;&gt;My savior: Forfait Free Max — 20€/month&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;#content-bonus-trick-devolo-magic-2&quot;&gt;Bonus trick: Devolo Magic 2&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;&lt;a id=&quot;content-life-before-starlink&quot; href=&quot;#content-life-before-starlink&quot; class=&quot;heading-permalink&quot; aria-hidden=&quot;true&quot; tabindex=&quot;-1&quot; title=&quot;Permalink&quot;&gt;#&lt;/a&gt;Life before Starlink&lt;/h2&gt;
&lt;p&gt;Before Starlink, I had a 4G router. I travelled with it all the way to Turkey, Norway, Portugal, and every country in between. Full coverage almost everywhere.&lt;/p&gt;
&lt;p&gt;It only ever failed me in rare spots: on top of a mountain right under the antenna, or stuck between two valleys with nothing in line of sight.&lt;/p&gt;
&lt;p&gt;So why did I switch in the first place? Data.&lt;/p&gt;
&lt;p&gt;I had to be really thoughtful about my usage. I disabled every auto-update I could find, checked my consumption every single day, and ended up going to cafés and laundromats whenever I needed to push a real update to my devices.&lt;/p&gt;
&lt;p&gt;That is the part that wore me down.&lt;/p&gt;
&lt;h2&gt;&lt;a id=&quot;content-why-i-tried-starlink&quot; href=&quot;#content-why-i-tried-starlink&quot; class=&quot;heading-permalink&quot; aria-hidden=&quot;true&quot; tabindex=&quot;-1&quot; title=&quot;Permalink&quot;&gt;#&lt;/a&gt;Why I tried Starlink&lt;/h2&gt;
&lt;p&gt;I met a few people on the road who had it and it was flawlessly good. Fast, stable, no data limit. Exactly what I wanted: stop thinking about megabytes.&lt;/p&gt;
&lt;p&gt;And honestly, it delivered.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;The good:&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;300 Mbps down, 30 Mbps up&lt;/strong&gt; — way more than I need.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Works everywhere in Europe&lt;/strong&gt; I have been so far.&lt;/li&gt;
&lt;li&gt;I can game, download large files, and livestream without worrying about it.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;So what is the problem?&lt;/p&gt;
&lt;h2&gt;&lt;a id=&quot;content-the-problems-piled-up&quot; href=&quot;#content-the-problems-piled-up&quot; class=&quot;heading-permalink&quot; aria-hidden=&quot;true&quot; tabindex=&quot;-1&quot; title=&quot;Permalink&quot;&gt;#&lt;/a&gt;The problems piled up&lt;/h2&gt;
&lt;p&gt;The longer I used it, the more the downsides started to weigh on me.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;I can't park under a tree anymore.&lt;/strong&gt; The antenna needs a clear view of the sky, which is very annoying in the summer.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;One more thing to orient.&lt;/strong&gt; I already think about sun direction and how level the car is parked. Now I also have to think about where the antenna points.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Energy hungry.&lt;/strong&gt; It pulls a continuous 40W. My old 5G router pulled 5W. On a van battery setup, that is a huge difference. I wanted to automate a shutdown at night but that's when my iphone syncronize everything.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;95€/month, and going up again.&lt;/strong&gt; That is the second price increase. At some point you have to ask yourself what you are actually paying for.&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;&lt;a id=&quot;content-my-savior-forfait-free-max--20month&quot; href=&quot;#content-my-savior-forfait-free-max--20month&quot; class=&quot;heading-permalink&quot; aria-hidden=&quot;true&quot; tabindex=&quot;-1&quot; title=&quot;Permalink&quot;&gt;#&lt;/a&gt;My savior: Forfait Free Max — 20€/month&lt;/h2&gt;
&lt;p&gt;A French mobile plan with unlimited data and proper EU roaming, dropped into a 5G router. That is it.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Back to ~5W of consumption&lt;/li&gt;
&lt;li&gt;Works under trees&lt;/li&gt;
&lt;li&gt;75€ less every month&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;And honestly it's as fast as before and even more on the uplaod side.&lt;/p&gt;
&lt;h2&gt;&lt;a id=&quot;content-bonus-trick-devolo-magic-2&quot; href=&quot;#content-bonus-trick-devolo-magic-2&quot; class=&quot;heading-permalink&quot; aria-hidden=&quot;true&quot; tabindex=&quot;-1&quot; title=&quot;Permalink&quot;&gt;#&lt;/a&gt;Bonus trick: Devolo Magic 2&lt;/h2&gt;
&lt;p&gt;A little extra setup I am pretty proud of.&lt;/p&gt;
&lt;p&gt;I added a powerline adapter (CPL) inside the van, wired between my exterior shore power inlet and my Victron inverter. The second adapter lives in a small bag I keep in a drawer.&lt;/p&gt;
&lt;p&gt;When I park at a friend's place and plug the van into their outdoor socket, I hand them the second adapter and ask them to plug it next to their router. That is it. The van is now on their home network through the power cable.&lt;/p&gt;
&lt;p&gt;No coverage to worry about, no data usage, no Wi-Fi password to type on every device. And it works at full LAN speed.&lt;/p&gt;</summary>
        <content type="html">&lt;p&gt;I had Starlink on the van for a while. It was great. I just cancelled it and went back to a SIM card in a 5G router. Here is why.&lt;/p&gt;
&lt;!--more--&gt;
&lt;ul class=&quot;table-of-contents not-prose&quot;&gt;
&lt;li&gt;&lt;a href=&quot;#content-life-before-starlink&quot;&gt;Life before Starlink&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;#content-why-i-tried-starlink&quot;&gt;Why I tried Starlink&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;#content-the-problems-piled-up&quot;&gt;The problems piled up&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;#content-my-savior-forfait-free-max--20month&quot;&gt;My savior: Forfait Free Max — 20€/month&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;#content-bonus-trick-devolo-magic-2&quot;&gt;Bonus trick: Devolo Magic 2&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;&lt;a id=&quot;content-life-before-starlink&quot; href=&quot;#content-life-before-starlink&quot; class=&quot;heading-permalink&quot; aria-hidden=&quot;true&quot; tabindex=&quot;-1&quot; title=&quot;Permalink&quot;&gt;#&lt;/a&gt;Life before Starlink&lt;/h2&gt;
&lt;p&gt;Before Starlink, I had a 4G router. I travelled with it all the way to Turkey, Norway, Portugal, and every country in between. Full coverage almost everywhere.&lt;/p&gt;
&lt;p&gt;It only ever failed me in rare spots: on top of a mountain right under the antenna, or stuck between two valleys with nothing in line of sight.&lt;/p&gt;
&lt;p&gt;So why did I switch in the first place? Data.&lt;/p&gt;
&lt;p&gt;I had to be really thoughtful about my usage. I disabled every auto-update I could find, checked my consumption every single day, and ended up going to cafés and laundromats whenever I needed to push a real update to my devices.&lt;/p&gt;
&lt;p&gt;That is the part that wore me down.&lt;/p&gt;
&lt;h2&gt;&lt;a id=&quot;content-why-i-tried-starlink&quot; href=&quot;#content-why-i-tried-starlink&quot; class=&quot;heading-permalink&quot; aria-hidden=&quot;true&quot; tabindex=&quot;-1&quot; title=&quot;Permalink&quot;&gt;#&lt;/a&gt;Why I tried Starlink&lt;/h2&gt;
&lt;p&gt;I met a few people on the road who had it and it was flawlessly good. Fast, stable, no data limit. Exactly what I wanted: stop thinking about megabytes.&lt;/p&gt;
&lt;p&gt;And honestly, it delivered.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;The good:&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;300 Mbps down, 30 Mbps up&lt;/strong&gt; — way more than I need.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Works everywhere in Europe&lt;/strong&gt; I have been so far.&lt;/li&gt;
&lt;li&gt;I can game, download large files, and livestream without worrying about it.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;So what is the problem?&lt;/p&gt;
&lt;h2&gt;&lt;a id=&quot;content-the-problems-piled-up&quot; href=&quot;#content-the-problems-piled-up&quot; class=&quot;heading-permalink&quot; aria-hidden=&quot;true&quot; tabindex=&quot;-1&quot; title=&quot;Permalink&quot;&gt;#&lt;/a&gt;The problems piled up&lt;/h2&gt;
&lt;p&gt;The longer I used it, the more the downsides started to weigh on me.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;I can't park under a tree anymore.&lt;/strong&gt; The antenna needs a clear view of the sky, which is very annoying in the summer.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;One more thing to orient.&lt;/strong&gt; I already think about sun direction and how level the car is parked. Now I also have to think about where the antenna points.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Energy hungry.&lt;/strong&gt; It pulls a continuous 40W. My old 5G router pulled 5W. On a van battery setup, that is a huge difference. I wanted to automate a shutdown at night but that's when my iphone syncronize everything.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;95€/month, and going up again.&lt;/strong&gt; That is the second price increase. At some point you have to ask yourself what you are actually paying for.&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;&lt;a id=&quot;content-my-savior-forfait-free-max--20month&quot; href=&quot;#content-my-savior-forfait-free-max--20month&quot; class=&quot;heading-permalink&quot; aria-hidden=&quot;true&quot; tabindex=&quot;-1&quot; title=&quot;Permalink&quot;&gt;#&lt;/a&gt;My savior: Forfait Free Max — 20€/month&lt;/h2&gt;
&lt;p&gt;A French mobile plan with unlimited data and proper EU roaming, dropped into a 5G router. That is it.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Back to ~5W of consumption&lt;/li&gt;
&lt;li&gt;Works under trees&lt;/li&gt;
&lt;li&gt;75€ less every month&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;And honestly it's as fast as before and even more on the uplaod side.&lt;/p&gt;
&lt;h2&gt;&lt;a id=&quot;content-bonus-trick-devolo-magic-2&quot; href=&quot;#content-bonus-trick-devolo-magic-2&quot; class=&quot;heading-permalink&quot; aria-hidden=&quot;true&quot; tabindex=&quot;-1&quot; title=&quot;Permalink&quot;&gt;#&lt;/a&gt;Bonus trick: Devolo Magic 2&lt;/h2&gt;
&lt;p&gt;A little extra setup I am pretty proud of.&lt;/p&gt;
&lt;p&gt;I added a powerline adapter (CPL) inside the van, wired between my exterior shore power inlet and my Victron inverter. The second adapter lives in a small bag I keep in a drawer.&lt;/p&gt;
&lt;p&gt;When I park at a friend's place and plug the van into their outdoor socket, I hand them the second adapter and ask them to plug it next to their router. That is it. The van is now on their home network through the power cable.&lt;/p&gt;
&lt;p&gt;No coverage to worry about, no data usage, no Wi-Fi password to type on every device. And it works at full LAN speed.&lt;/p&gt;</content>
        <author>
            <name>Eser DENIZ</name>
        </author>
    </entry>
    <entry>
        <title type="text">I made 4 plugins for NativePHP</title>
        <link href="https://srwiez.com/posts/i-made-4-plugins-for-nativephp"/>
        <id>https://srwiez.com/posts/i-made-4-plugins-for-nativephp</id>
        <published>2026-04-16T00:00:00+00:00</published>
        <updated>2026-04-15T08:48:30+00:00</updated>
        <summary type="text">&lt;p&gt;I've been involved in one way or another with the NativePHP team since the rise of the desktop version. I've followed their journey from the backstage and helped them when I could. I'm extremely proud of what they have accomplished until now.&lt;/p&gt;
&lt;!--more--&gt;
&lt;p&gt;When Shane and Simon introduced me to the plugin system, I knew I wanted to explore its full potential.&lt;/p&gt;
&lt;p&gt;Let me tell you, there are no limits to what you can achieve.&lt;/p&gt;
&lt;p&gt;I created four basic plugins to meet my needs and decided to publish them.&lt;/p&gt;
&lt;p&gt;But I assure you, you can run any native code you want with NativePHP; it's fast and reliable.&lt;/p&gt;
&lt;ul class=&quot;table-of-contents not-prose&quot;&gt;
&lt;li&gt;&lt;a href=&quot;#content-the-plugins&quot;&gt;The plugins&lt;/a&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;#content-nativephp-mobile-screen-free&quot;&gt;nativephp-mobile-screen (free)&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;#content-nativephp-mobile-contacts-paid&quot;&gt;nativephp-mobile-contacts (paid)&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;#content-nativephp-mobile-calendar-paid&quot;&gt;nativephp-mobile-calendar (paid)&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;#content-nativephp-mobile-screenshots-paid&quot;&gt;nativephp-mobile-screenshots (paid)&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;#content-why-paid&quot;&gt;Why paid?&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;#content-whats-next&quot;&gt;What's next&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;&lt;a id=&quot;content-the-plugins&quot; href=&quot;#content-the-plugins&quot; class=&quot;heading-permalink&quot; aria-hidden=&quot;true&quot; tabindex=&quot;-1&quot; title=&quot;Permalink&quot;&gt;#&lt;/a&gt;The plugins&lt;/h2&gt;
&lt;h3&gt;&lt;a id=&quot;content-nativephp-mobile-screen-free&quot; href=&quot;#content-nativephp-mobile-screen-free&quot; class=&quot;heading-permalink&quot; aria-hidden=&quot;true&quot; tabindex=&quot;-1&quot; title=&quot;Permalink&quot;&gt;#&lt;/a&gt;nativephp-mobile-screen (free)&lt;/h3&gt;
&lt;p&gt;A small plugin to keep the screen awake and control brightness from your NativePHP mobile app. Useful for anything that stays on display: dashboards, readers, kiosk-style apps.&lt;/p&gt;
&lt;p&gt;Grab it on &lt;a href=&quot;https://github.com/SRWieZ/nativephp-mobile-screen&quot;&gt;GitHub&lt;/a&gt;.&lt;/p&gt;
&lt;h3&gt;&lt;a id=&quot;content-nativephp-mobile-contacts-paid&quot; href=&quot;#content-nativephp-mobile-contacts-paid&quot; class=&quot;heading-permalink&quot; aria-hidden=&quot;true&quot; tabindex=&quot;-1&quot; title=&quot;Permalink&quot;&gt;#&lt;/a&gt;nativephp-mobile-contacts (paid)&lt;/h3&gt;
&lt;p&gt;Read and write device contacts straight from PHP. Handy when your app needs to pick a recipient, sync with the address book, or add a new contact after an in-app action.&lt;/p&gt;
&lt;p&gt;Available on the &lt;a href=&quot;https://nativephp.com/plugins/srwiez/nativephp-mobile-contacts&quot;&gt;NativePHP marketplace&lt;/a&gt;.&lt;/p&gt;
&lt;h3&gt;&lt;a id=&quot;content-nativephp-mobile-calendar-paid&quot; href=&quot;#content-nativephp-mobile-calendar-paid&quot; class=&quot;heading-permalink&quot; aria-hidden=&quot;true&quot; tabindex=&quot;-1&quot; title=&quot;Permalink&quot;&gt;#&lt;/a&gt;nativephp-mobile-calendar (paid)&lt;/h3&gt;
&lt;p&gt;Create, update and read calendar events from your NativePHP app. Great for booking flows, reminders, or any feature that needs to land on the user's calendar without leaving your app.&lt;/p&gt;
&lt;p&gt;Available on the &lt;a href=&quot;https://nativephp.com/plugins/srwiez/nativephp-mobile-calendar&quot;&gt;NativePHP marketplace&lt;/a&gt;.&lt;/p&gt;
&lt;h3&gt;&lt;a id=&quot;content-nativephp-mobile-screenshots-paid&quot; href=&quot;#content-nativephp-mobile-screenshots-paid&quot; class=&quot;heading-permalink&quot; aria-hidden=&quot;true&quot; tabindex=&quot;-1&quot; title=&quot;Permalink&quot;&gt;#&lt;/a&gt;nativephp-mobile-screenshots (paid)&lt;/h3&gt;
&lt;p&gt;Capture the current screen programmatically — for in-app bug reports, share sheets, or &amp;quot;save this view&amp;quot; features.&lt;/p&gt;
&lt;p&gt;Available on the &lt;a href=&quot;https://nativephp.com/plugins/srwiez/nativephp-mobile-screenshots&quot;&gt;NativePHP marketplace&lt;/a&gt;.&lt;/p&gt;
&lt;h2&gt;&lt;a id=&quot;content-why-paid&quot; href=&quot;#content-why-paid&quot; class=&quot;heading-permalink&quot; aria-hidden=&quot;true&quot; tabindex=&quot;-1&quot; title=&quot;Permalink&quot;&gt;#&lt;/a&gt;Why paid?&lt;/h2&gt;
&lt;p&gt;The three mobile plugins above ship with native Swift and Kotlin code I had to test and maintain on both platforms. Selling them on the marketplace is what makes it sustainable to keep them up to date as iOS and Android evolve.&lt;/p&gt;
&lt;p&gt;&lt;code&gt;nativephp-mobile-screen&lt;/code&gt; stays free and open source — it's a good starting point if you want to see how a NativePHP mobile plugin is structured.&lt;/p&gt;
&lt;h2&gt;&lt;a id=&quot;content-whats-next&quot; href=&quot;#content-whats-next&quot; class=&quot;heading-permalink&quot; aria-hidden=&quot;true&quot; tabindex=&quot;-1&quot; title=&quot;Permalink&quot;&gt;#&lt;/a&gt;What's next&lt;/h2&gt;
&lt;p&gt;I have a few more ideas, but I want to see if those will sell first.&lt;/p&gt;
&lt;p&gt;Maintaining code is a full-time job, and I want to be compensated for it.&lt;/p&gt;
&lt;p&gt;If those three are successful enough, I will likely continue creating new plugins.&lt;/p&gt;
&lt;p&gt;At the very least, I will develop one more that I need for an app.&lt;/p&gt;</summary>
        <content type="html">&lt;p&gt;I've been involved in one way or another with the NativePHP team since the rise of the desktop version. I've followed their journey from the backstage and helped them when I could. I'm extremely proud of what they have accomplished until now.&lt;/p&gt;
&lt;!--more--&gt;
&lt;p&gt;When Shane and Simon introduced me to the plugin system, I knew I wanted to explore its full potential.&lt;/p&gt;
&lt;p&gt;Let me tell you, there are no limits to what you can achieve.&lt;/p&gt;
&lt;p&gt;I created four basic plugins to meet my needs and decided to publish them.&lt;/p&gt;
&lt;p&gt;But I assure you, you can run any native code you want with NativePHP; it's fast and reliable.&lt;/p&gt;
&lt;ul class=&quot;table-of-contents not-prose&quot;&gt;
&lt;li&gt;&lt;a href=&quot;#content-the-plugins&quot;&gt;The plugins&lt;/a&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;#content-nativephp-mobile-screen-free&quot;&gt;nativephp-mobile-screen (free)&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;#content-nativephp-mobile-contacts-paid&quot;&gt;nativephp-mobile-contacts (paid)&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;#content-nativephp-mobile-calendar-paid&quot;&gt;nativephp-mobile-calendar (paid)&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;#content-nativephp-mobile-screenshots-paid&quot;&gt;nativephp-mobile-screenshots (paid)&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;#content-why-paid&quot;&gt;Why paid?&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;#content-whats-next&quot;&gt;What's next&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;&lt;a id=&quot;content-the-plugins&quot; href=&quot;#content-the-plugins&quot; class=&quot;heading-permalink&quot; aria-hidden=&quot;true&quot; tabindex=&quot;-1&quot; title=&quot;Permalink&quot;&gt;#&lt;/a&gt;The plugins&lt;/h2&gt;
&lt;h3&gt;&lt;a id=&quot;content-nativephp-mobile-screen-free&quot; href=&quot;#content-nativephp-mobile-screen-free&quot; class=&quot;heading-permalink&quot; aria-hidden=&quot;true&quot; tabindex=&quot;-1&quot; title=&quot;Permalink&quot;&gt;#&lt;/a&gt;nativephp-mobile-screen (free)&lt;/h3&gt;
&lt;p&gt;A small plugin to keep the screen awake and control brightness from your NativePHP mobile app. Useful for anything that stays on display: dashboards, readers, kiosk-style apps.&lt;/p&gt;
&lt;p&gt;Grab it on &lt;a href=&quot;https://github.com/SRWieZ/nativephp-mobile-screen&quot;&gt;GitHub&lt;/a&gt;.&lt;/p&gt;
&lt;h3&gt;&lt;a id=&quot;content-nativephp-mobile-contacts-paid&quot; href=&quot;#content-nativephp-mobile-contacts-paid&quot; class=&quot;heading-permalink&quot; aria-hidden=&quot;true&quot; tabindex=&quot;-1&quot; title=&quot;Permalink&quot;&gt;#&lt;/a&gt;nativephp-mobile-contacts (paid)&lt;/h3&gt;
&lt;p&gt;Read and write device contacts straight from PHP. Handy when your app needs to pick a recipient, sync with the address book, or add a new contact after an in-app action.&lt;/p&gt;
&lt;p&gt;Available on the &lt;a href=&quot;https://nativephp.com/plugins/srwiez/nativephp-mobile-contacts&quot;&gt;NativePHP marketplace&lt;/a&gt;.&lt;/p&gt;
&lt;h3&gt;&lt;a id=&quot;content-nativephp-mobile-calendar-paid&quot; href=&quot;#content-nativephp-mobile-calendar-paid&quot; class=&quot;heading-permalink&quot; aria-hidden=&quot;true&quot; tabindex=&quot;-1&quot; title=&quot;Permalink&quot;&gt;#&lt;/a&gt;nativephp-mobile-calendar (paid)&lt;/h3&gt;
&lt;p&gt;Create, update and read calendar events from your NativePHP app. Great for booking flows, reminders, or any feature that needs to land on the user's calendar without leaving your app.&lt;/p&gt;
&lt;p&gt;Available on the &lt;a href=&quot;https://nativephp.com/plugins/srwiez/nativephp-mobile-calendar&quot;&gt;NativePHP marketplace&lt;/a&gt;.&lt;/p&gt;
&lt;h3&gt;&lt;a id=&quot;content-nativephp-mobile-screenshots-paid&quot; href=&quot;#content-nativephp-mobile-screenshots-paid&quot; class=&quot;heading-permalink&quot; aria-hidden=&quot;true&quot; tabindex=&quot;-1&quot; title=&quot;Permalink&quot;&gt;#&lt;/a&gt;nativephp-mobile-screenshots (paid)&lt;/h3&gt;
&lt;p&gt;Capture the current screen programmatically — for in-app bug reports, share sheets, or &amp;quot;save this view&amp;quot; features.&lt;/p&gt;
&lt;p&gt;Available on the &lt;a href=&quot;https://nativephp.com/plugins/srwiez/nativephp-mobile-screenshots&quot;&gt;NativePHP marketplace&lt;/a&gt;.&lt;/p&gt;
&lt;h2&gt;&lt;a id=&quot;content-why-paid&quot; href=&quot;#content-why-paid&quot; class=&quot;heading-permalink&quot; aria-hidden=&quot;true&quot; tabindex=&quot;-1&quot; title=&quot;Permalink&quot;&gt;#&lt;/a&gt;Why paid?&lt;/h2&gt;
&lt;p&gt;The three mobile plugins above ship with native Swift and Kotlin code I had to test and maintain on both platforms. Selling them on the marketplace is what makes it sustainable to keep them up to date as iOS and Android evolve.&lt;/p&gt;
&lt;p&gt;&lt;code&gt;nativephp-mobile-screen&lt;/code&gt; stays free and open source — it's a good starting point if you want to see how a NativePHP mobile plugin is structured.&lt;/p&gt;
&lt;h2&gt;&lt;a id=&quot;content-whats-next&quot; href=&quot;#content-whats-next&quot; class=&quot;heading-permalink&quot; aria-hidden=&quot;true&quot; tabindex=&quot;-1&quot; title=&quot;Permalink&quot;&gt;#&lt;/a&gt;What's next&lt;/h2&gt;
&lt;p&gt;I have a few more ideas, but I want to see if those will sell first.&lt;/p&gt;
&lt;p&gt;Maintaining code is a full-time job, and I want to be compensated for it.&lt;/p&gt;
&lt;p&gt;If those three are successful enough, I will likely continue creating new plugins.&lt;/p&gt;
&lt;p&gt;At the very least, I will develop one more that I need for an app.&lt;/p&gt;</content>
        <author>
            <name>Eser DENIZ</name>
        </author>
    </entry>
    <entry>
        <title type="text">Devkeepr: your trusted companion for your dev environment</title>
        <link href="https://srwiez.com/posts/devkeepr-your-trusted-companion-for-your-dev-environment"/>
        <id>https://srwiez.com/posts/devkeepr-your-trusted-companion-for-your-dev-environment</id>
        <published>2026-04-14T00:00:00+00:00</published>
        <updated>2026-04-14T15:34:41+00:00</updated>
        <summary type="text">&lt;p&gt;Count your &lt;code&gt;node_modules&lt;/code&gt; folders. Now multiply by 400MB. Yeah, that's the problem &lt;a href=&quot;https://github.com/gwleuverink&quot;&gt;Willem&lt;/a&gt; and I have been quietly fixing for the past few months.&lt;/p&gt;
&lt;!--more--&gt;
&lt;ul class=&quot;table-of-contents not-prose&quot;&gt;
&lt;li&gt;&lt;a href=&quot;#content-whats-devkeepr&quot;&gt;What's Devkeepr?&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;#content-what-it-does&quot;&gt;What it does&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;#content-why-we-built-it&quot;&gt;Why we built it&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;#content-try-it&quot;&gt;Try it&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;&lt;a id=&quot;content-whats-devkeepr&quot; href=&quot;#content-whats-devkeepr&quot; class=&quot;heading-permalink&quot; aria-hidden=&quot;true&quot; tabindex=&quot;-1&quot; title=&quot;Permalink&quot;&gt;#&lt;/a&gt;What's Devkeepr?&lt;/h2&gt;
&lt;p&gt;&lt;a href=&quot;https://devkeepr.app&quot;&gt;Devkeepr&lt;/a&gt; is a desktop app that takes care of your dev machine while you're not looking. Think CleanMyMac, but built by people who actually know what &lt;code&gt;vendor&lt;/code&gt;, &lt;code&gt;node_modules&lt;/code&gt;, &lt;code&gt;.venv&lt;/code&gt;, &lt;code&gt;target&lt;/code&gt; and &lt;code&gt;bin/Debug&lt;/code&gt; are doing to your SSD.&lt;/p&gt;
&lt;p&gt;It detects 50+ stacks (PHP, Node, Python, Ruby, Go, Rust, .NET…) and gives you a single command center for all your projects.&lt;/p&gt;
&lt;h2&gt;&lt;a id=&quot;content-what-it-does&quot; href=&quot;#content-what-it-does&quot; class=&quot;heading-permalink&quot; aria-hidden=&quot;true&quot; tabindex=&quot;-1&quot; title=&quot;Permalink&quot;&gt;#&lt;/a&gt;What it does&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Smart hibernation&lt;/strong&gt; — Idle projects get their dependencies, caches and build artifacts wiped automatically. They wake up the moment you &lt;code&gt;cd&lt;/code&gt; into them or open them in your IDE. A 2.4 GB project becomes 3.8 MB on disk until you actually need it again.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Project command center&lt;/strong&gt; — Run npm scripts, composer scripts, Makefile targets or GitHub workflows from one place, across all your projects.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Global updater&lt;/strong&gt; — Keeps your global packages up to date on a schedule.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Disk usage dashboard&lt;/strong&gt; — See exactly where your disk space is going across every project.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Git auto-sync&lt;/strong&gt; — Fetches and prunes remote branches so your repos never go stale.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Workflow &amp;amp; deployment monitors&lt;/strong&gt; &lt;em&gt;(Pro)&lt;/em&gt; — Watch CI/CD on GitHub, GitLab, Bitbucket and deployments on Forge, Cloud, Vercel without leaving your IDE.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;&lt;code&gt;dk&lt;/code&gt; CLI&lt;/strong&gt; &lt;em&gt;(Pro)&lt;/em&gt; — The fastest way to jump between projects from the terminal.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Configuration lives in a &lt;code&gt;devkeepr.yml&lt;/code&gt; file you commit alongside your project, so your whole team gets the same hibernate/wake hooks for free.&lt;/p&gt;
&lt;div x-data=&quot;codeBlock&quot; class=&quot;code-block relative&quot;&gt;&lt;div class=&quot;flex space-x-2 items-center absolute top-0 right-0&quot;&gt;
    &lt;div x-cloak x-show=&quot;showMessage&quot; x-transition class=&quot;py-2 animate-bounce transition duration-300 mt-1 text-sky-500 text-xs&quot;&gt;Copied!&lt;/div&gt;
    &lt;button
        type=&quot;button&quot;
        title=&quot;Copy to clipboard&quot;
        class=&quot;hidden sm:block p-2 pl-3 transition duration-300&quot;
        @click.prevent=&quot;copyToClipboard&quot;
        :class=&quot;{
            'text-black/30 hover:text-black/80': !showMessage,
            'text-sky-500 hover:text-sky-700': showMessage,
        }&quot;&gt;
        &lt;svg xmlns=&quot;http://www.w3.org/2000/svg&quot; fill=&quot;none&quot; viewBox=&quot;0 0 24 24&quot; stroke-width=&quot;1.5&quot; stroke=&quot;currentColor&quot; class=&quot;block w-6 h-6&quot;&gt;
            &lt;path fill=&quot;white&quot; stroke-linecap=&quot;round&quot; stroke-linejoin=&quot;round&quot; d=&quot;M11.35 3.836c-.065.21-.1.433-.1.664 0 .414.336.75.75.75h4.5a.75.75 0 00.75-.75 2.25 2.25 0 00-.1-.664m-5.8 0A2.251 2.251 0 0113.5 2.25H15c1.012 0 1.867.668 2.15 1.586m-5.8 0c-.376.023-.75.05-1.124.08C9.095 4.01 8.25 4.973 8.25 6.108V8.25m8.9-4.414c.376.023.75.05 1.124.08 1.131.094 1.976 1.057 1.976 2.192V16.5A2.25 2.25 0 0118 18.75h-2.25m-7.5-10.5H4.875c-.621 0-1.125.504-1.125 1.125v11.25c0 .621.504 1.125 1.125 1.125h9.75c.621 0 1.125-.504 1.125-1.125V18.75m-7.5-10.5h6.375c.621 0 1.125.504 1.125 1.125v9.375m-8.25-3l1.5 1.5 3-3.75&quot; /&gt;
        &lt;/svg&gt;
    &lt;/button&gt;
&lt;/div&gt;&lt;pre class=&quot;phiki language-yaml github-light&quot; data-language=&quot;yaml&quot; style=&quot;background-color: #fff;color: #24292e;&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;token&quot; style=&quot;color: #22863a;&quot;&gt;a&lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #22863a;&quot;&gt;utoWake&lt;/span&gt;&lt;span class=&quot;token&quot;&gt;:&lt;/span&gt;&lt;span class=&quot;token&quot;&gt; &lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #005cc5;&quot;&gt;true&lt;/span&gt;&lt;span class=&quot;token&quot;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;token&quot; style=&quot;color: #22863a;&quot;&gt;s&lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #22863a;&quot;&gt;yncUpstream&lt;/span&gt;&lt;span class=&quot;token&quot;&gt;:&lt;/span&gt;&lt;span class=&quot;token&quot;&gt; &lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #005cc5;&quot;&gt;true&lt;/span&gt;&lt;span class=&quot;token&quot;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;token&quot; style=&quot;color: #22863a;&quot;&gt;h&lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #22863a;&quot;&gt;ibernateSchedule&lt;/span&gt;&lt;span class=&quot;token&quot;&gt;:&lt;/span&gt;&lt;span class=&quot;token&quot;&gt; &lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #032f62;&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #032f62;&quot;&gt;weekly&lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #032f62;&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span class=&quot;token&quot;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;token&quot;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;token&quot; style=&quot;color: #22863a;&quot;&gt;h&lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #22863a;&quot;&gt;ibernateCommands&lt;/span&gt;&lt;span class=&quot;token&quot;&gt;:&lt;/span&gt;&lt;span class=&quot;token&quot;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;token&quot;&gt;  &lt;/span&gt;&lt;span class=&quot;token&quot;&gt;-&lt;/span&gt;&lt;span class=&quot;token&quot;&gt; &lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #032f62;&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #032f62;&quot;&gt;rm -rf vendor&lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #032f62;&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span class=&quot;token&quot;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;token&quot;&gt;  &lt;/span&gt;&lt;span class=&quot;token&quot;&gt;-&lt;/span&gt;&lt;span class=&quot;token&quot;&gt; &lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #032f62;&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #032f62;&quot;&gt;rm -rf node_modules&lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #032f62;&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span class=&quot;token&quot;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;token&quot;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;token&quot; style=&quot;color: #22863a;&quot;&gt;w&lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #22863a;&quot;&gt;akeCommands&lt;/span&gt;&lt;span class=&quot;token&quot;&gt;:&lt;/span&gt;&lt;span class=&quot;token&quot;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;token&quot;&gt;  &lt;/span&gt;&lt;span class=&quot;token&quot;&gt;-&lt;/span&gt;&lt;span class=&quot;token&quot;&gt; &lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #032f62;&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #032f62;&quot;&gt;composer install&lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #032f62;&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span class=&quot;token&quot;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;token&quot;&gt;  &lt;/span&gt;&lt;span class=&quot;token&quot;&gt;-&lt;/span&gt;&lt;span class=&quot;token&quot;&gt; &lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #032f62;&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #032f62;&quot;&gt;npm install&lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #032f62;&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span class=&quot;token&quot;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;h2&gt;&lt;a id=&quot;content-why-we-built-it&quot; href=&quot;#content-why-we-built-it&quot; class=&quot;heading-permalink&quot; aria-hidden=&quot;true&quot; tabindex=&quot;-1&quot; title=&quot;Permalink&quot;&gt;#&lt;/a&gt;Why we built it&lt;/h2&gt;
&lt;p&gt;Willem and I met for the first time at Laracon EU 2025. We'd been collaborating on &lt;a href=&quot;https://nativephp.com&quot;&gt;NativePHP&lt;/a&gt; for months but never sat down together. Turns out we'd both been quietly building the same little desktop apps to scratch the same itches: a CI workflow monitor on his side, a deployment tracker on mine, both of us with our own scripts to clean up idle projects.&lt;/p&gt;
&lt;p&gt;The conversation went from &amp;quot;we should share notes&amp;quot; to &amp;quot;we should just merge all of this into one app&amp;quot; in about ten minutes.&lt;/p&gt;
&lt;p&gt;About a thousand commits later, here we are.&lt;/p&gt;
&lt;p&gt;Devkeepr is also our excuse to push NativePHP to its limits. Everything we learn building it goes back upstream, so the framework gets better for everyone.&lt;/p&gt;
&lt;h2&gt;&lt;a id=&quot;content-try-it&quot; href=&quot;#content-try-it&quot; class=&quot;heading-permalink&quot; aria-hidden=&quot;true&quot; tabindex=&quot;-1&quot; title=&quot;Permalink&quot;&gt;#&lt;/a&gt;Try it&lt;/h2&gt;
&lt;p&gt;Devkeepr is free to use, with a Pro tier for the workflow monitor, deployment watcher and &lt;code&gt;dk&lt;/code&gt; CLI.&lt;/p&gt;
&lt;p&gt;Grab it at &lt;a href=&quot;https://devkeepr.app&quot;&gt;devkeepr.app&lt;/a&gt;.&lt;/p&gt;</summary>
        <content type="html">&lt;p&gt;Count your &lt;code&gt;node_modules&lt;/code&gt; folders. Now multiply by 400MB. Yeah, that's the problem &lt;a href=&quot;https://github.com/gwleuverink&quot;&gt;Willem&lt;/a&gt; and I have been quietly fixing for the past few months.&lt;/p&gt;
&lt;!--more--&gt;
&lt;ul class=&quot;table-of-contents not-prose&quot;&gt;
&lt;li&gt;&lt;a href=&quot;#content-whats-devkeepr&quot;&gt;What's Devkeepr?&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;#content-what-it-does&quot;&gt;What it does&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;#content-why-we-built-it&quot;&gt;Why we built it&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;#content-try-it&quot;&gt;Try it&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;&lt;a id=&quot;content-whats-devkeepr&quot; href=&quot;#content-whats-devkeepr&quot; class=&quot;heading-permalink&quot; aria-hidden=&quot;true&quot; tabindex=&quot;-1&quot; title=&quot;Permalink&quot;&gt;#&lt;/a&gt;What's Devkeepr?&lt;/h2&gt;
&lt;p&gt;&lt;a href=&quot;https://devkeepr.app&quot;&gt;Devkeepr&lt;/a&gt; is a desktop app that takes care of your dev machine while you're not looking. Think CleanMyMac, but built by people who actually know what &lt;code&gt;vendor&lt;/code&gt;, &lt;code&gt;node_modules&lt;/code&gt;, &lt;code&gt;.venv&lt;/code&gt;, &lt;code&gt;target&lt;/code&gt; and &lt;code&gt;bin/Debug&lt;/code&gt; are doing to your SSD.&lt;/p&gt;
&lt;p&gt;It detects 50+ stacks (PHP, Node, Python, Ruby, Go, Rust, .NET…) and gives you a single command center for all your projects.&lt;/p&gt;
&lt;h2&gt;&lt;a id=&quot;content-what-it-does&quot; href=&quot;#content-what-it-does&quot; class=&quot;heading-permalink&quot; aria-hidden=&quot;true&quot; tabindex=&quot;-1&quot; title=&quot;Permalink&quot;&gt;#&lt;/a&gt;What it does&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Smart hibernation&lt;/strong&gt; — Idle projects get their dependencies, caches and build artifacts wiped automatically. They wake up the moment you &lt;code&gt;cd&lt;/code&gt; into them or open them in your IDE. A 2.4 GB project becomes 3.8 MB on disk until you actually need it again.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Project command center&lt;/strong&gt; — Run npm scripts, composer scripts, Makefile targets or GitHub workflows from one place, across all your projects.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Global updater&lt;/strong&gt; — Keeps your global packages up to date on a schedule.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Disk usage dashboard&lt;/strong&gt; — See exactly where your disk space is going across every project.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Git auto-sync&lt;/strong&gt; — Fetches and prunes remote branches so your repos never go stale.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Workflow &amp;amp; deployment monitors&lt;/strong&gt; &lt;em&gt;(Pro)&lt;/em&gt; — Watch CI/CD on GitHub, GitLab, Bitbucket and deployments on Forge, Cloud, Vercel without leaving your IDE.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;&lt;code&gt;dk&lt;/code&gt; CLI&lt;/strong&gt; &lt;em&gt;(Pro)&lt;/em&gt; — The fastest way to jump between projects from the terminal.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Configuration lives in a &lt;code&gt;devkeepr.yml&lt;/code&gt; file you commit alongside your project, so your whole team gets the same hibernate/wake hooks for free.&lt;/p&gt;
&lt;div x-data=&quot;codeBlock&quot; class=&quot;code-block relative&quot;&gt;&lt;div class=&quot;flex space-x-2 items-center absolute top-0 right-0&quot;&gt;
    &lt;div x-cloak x-show=&quot;showMessage&quot; x-transition class=&quot;py-2 animate-bounce transition duration-300 mt-1 text-sky-500 text-xs&quot;&gt;Copied!&lt;/div&gt;
    &lt;button
        type=&quot;button&quot;
        title=&quot;Copy to clipboard&quot;
        class=&quot;hidden sm:block p-2 pl-3 transition duration-300&quot;
        @click.prevent=&quot;copyToClipboard&quot;
        :class=&quot;{
            'text-black/30 hover:text-black/80': !showMessage,
            'text-sky-500 hover:text-sky-700': showMessage,
        }&quot;&gt;
        &lt;svg xmlns=&quot;http://www.w3.org/2000/svg&quot; fill=&quot;none&quot; viewBox=&quot;0 0 24 24&quot; stroke-width=&quot;1.5&quot; stroke=&quot;currentColor&quot; class=&quot;block w-6 h-6&quot;&gt;
            &lt;path fill=&quot;white&quot; stroke-linecap=&quot;round&quot; stroke-linejoin=&quot;round&quot; d=&quot;M11.35 3.836c-.065.21-.1.433-.1.664 0 .414.336.75.75.75h4.5a.75.75 0 00.75-.75 2.25 2.25 0 00-.1-.664m-5.8 0A2.251 2.251 0 0113.5 2.25H15c1.012 0 1.867.668 2.15 1.586m-5.8 0c-.376.023-.75.05-1.124.08C9.095 4.01 8.25 4.973 8.25 6.108V8.25m8.9-4.414c.376.023.75.05 1.124.08 1.131.094 1.976 1.057 1.976 2.192V16.5A2.25 2.25 0 0118 18.75h-2.25m-7.5-10.5H4.875c-.621 0-1.125.504-1.125 1.125v11.25c0 .621.504 1.125 1.125 1.125h9.75c.621 0 1.125-.504 1.125-1.125V18.75m-7.5-10.5h6.375c.621 0 1.125.504 1.125 1.125v9.375m-8.25-3l1.5 1.5 3-3.75&quot; /&gt;
        &lt;/svg&gt;
    &lt;/button&gt;
&lt;/div&gt;&lt;pre class=&quot;phiki language-yaml github-light&quot; data-language=&quot;yaml&quot; style=&quot;background-color: #fff;color: #24292e;&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;token&quot; style=&quot;color: #22863a;&quot;&gt;a&lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #22863a;&quot;&gt;utoWake&lt;/span&gt;&lt;span class=&quot;token&quot;&gt;:&lt;/span&gt;&lt;span class=&quot;token&quot;&gt; &lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #005cc5;&quot;&gt;true&lt;/span&gt;&lt;span class=&quot;token&quot;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;token&quot; style=&quot;color: #22863a;&quot;&gt;s&lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #22863a;&quot;&gt;yncUpstream&lt;/span&gt;&lt;span class=&quot;token&quot;&gt;:&lt;/span&gt;&lt;span class=&quot;token&quot;&gt; &lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #005cc5;&quot;&gt;true&lt;/span&gt;&lt;span class=&quot;token&quot;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;token&quot; style=&quot;color: #22863a;&quot;&gt;h&lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #22863a;&quot;&gt;ibernateSchedule&lt;/span&gt;&lt;span class=&quot;token&quot;&gt;:&lt;/span&gt;&lt;span class=&quot;token&quot;&gt; &lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #032f62;&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #032f62;&quot;&gt;weekly&lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #032f62;&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span class=&quot;token&quot;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;token&quot;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;token&quot; style=&quot;color: #22863a;&quot;&gt;h&lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #22863a;&quot;&gt;ibernateCommands&lt;/span&gt;&lt;span class=&quot;token&quot;&gt;:&lt;/span&gt;&lt;span class=&quot;token&quot;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;token&quot;&gt;  &lt;/span&gt;&lt;span class=&quot;token&quot;&gt;-&lt;/span&gt;&lt;span class=&quot;token&quot;&gt; &lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #032f62;&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #032f62;&quot;&gt;rm -rf vendor&lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #032f62;&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span class=&quot;token&quot;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;token&quot;&gt;  &lt;/span&gt;&lt;span class=&quot;token&quot;&gt;-&lt;/span&gt;&lt;span class=&quot;token&quot;&gt; &lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #032f62;&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #032f62;&quot;&gt;rm -rf node_modules&lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #032f62;&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span class=&quot;token&quot;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;token&quot;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;token&quot; style=&quot;color: #22863a;&quot;&gt;w&lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #22863a;&quot;&gt;akeCommands&lt;/span&gt;&lt;span class=&quot;token&quot;&gt;:&lt;/span&gt;&lt;span class=&quot;token&quot;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;token&quot;&gt;  &lt;/span&gt;&lt;span class=&quot;token&quot;&gt;-&lt;/span&gt;&lt;span class=&quot;token&quot;&gt; &lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #032f62;&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #032f62;&quot;&gt;composer install&lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #032f62;&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span class=&quot;token&quot;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;token&quot;&gt;  &lt;/span&gt;&lt;span class=&quot;token&quot;&gt;-&lt;/span&gt;&lt;span class=&quot;token&quot;&gt; &lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #032f62;&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #032f62;&quot;&gt;npm install&lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #032f62;&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span class=&quot;token&quot;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;h2&gt;&lt;a id=&quot;content-why-we-built-it&quot; href=&quot;#content-why-we-built-it&quot; class=&quot;heading-permalink&quot; aria-hidden=&quot;true&quot; tabindex=&quot;-1&quot; title=&quot;Permalink&quot;&gt;#&lt;/a&gt;Why we built it&lt;/h2&gt;
&lt;p&gt;Willem and I met for the first time at Laracon EU 2025. We'd been collaborating on &lt;a href=&quot;https://nativephp.com&quot;&gt;NativePHP&lt;/a&gt; for months but never sat down together. Turns out we'd both been quietly building the same little desktop apps to scratch the same itches: a CI workflow monitor on his side, a deployment tracker on mine, both of us with our own scripts to clean up idle projects.&lt;/p&gt;
&lt;p&gt;The conversation went from &amp;quot;we should share notes&amp;quot; to &amp;quot;we should just merge all of this into one app&amp;quot; in about ten minutes.&lt;/p&gt;
&lt;p&gt;About a thousand commits later, here we are.&lt;/p&gt;
&lt;p&gt;Devkeepr is also our excuse to push NativePHP to its limits. Everything we learn building it goes back upstream, so the framework gets better for everyone.&lt;/p&gt;
&lt;h2&gt;&lt;a id=&quot;content-try-it&quot; href=&quot;#content-try-it&quot; class=&quot;heading-permalink&quot; aria-hidden=&quot;true&quot; tabindex=&quot;-1&quot; title=&quot;Permalink&quot;&gt;#&lt;/a&gt;Try it&lt;/h2&gt;
&lt;p&gt;Devkeepr is free to use, with a Pro tier for the workflow monitor, deployment watcher and &lt;code&gt;dk&lt;/code&gt; CLI.&lt;/p&gt;
&lt;p&gt;Grab it at &lt;a href=&quot;https://devkeepr.app&quot;&gt;devkeepr.app&lt;/a&gt;.&lt;/p&gt;</content>
        <author>
            <name>Eser DENIZ</name>
        </author>
    </entry>
    <entry>
        <title type="text">I made a CLI tool to keep an eye on your dependencies: Whatsdiff v2 is out!</title>
        <link href="https://srwiez.com/posts/whatsdiff-an-open-source-tool-to-keep-an-eye-on-your-dependencies"/>
        <id>https://srwiez.com/posts/whatsdiff-an-open-source-tool-to-keep-an-eye-on-your-dependencies</id>
        <published>2025-10-29T00:00:00+00:00</published>
        <updated>2025-10-29T18:45:33+00:00</updated>
        <summary type="text">&lt;p&gt;I made this tool for myself. After a year of using it, I decided it needed some attention. v2 is here with a website and documentation.&lt;/p&gt;
&lt;!--more--&gt;
&lt;ul class=&quot;table-of-contents not-prose&quot;&gt;
&lt;li&gt;&lt;a href=&quot;#content-whats-whatsdiff&quot;&gt;What's Whatsdiff?&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;#content-what-it-does&quot;&gt;What It Does&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;#content-how-to-you-use-it&quot;&gt;How to you use it?&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;#content-the-real-cool-stuff&quot;&gt;The real cool stuff&lt;/a&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;#content-terminal-ui&quot;&gt;Terminal UI&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;#content-model-context-protocol-mcp-server&quot;&gt;Model Context Protocol (MCP) Server&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;#content-conclusion&quot;&gt;Conclusion&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;&lt;a id=&quot;content-whats-whatsdiff&quot; href=&quot;#content-whats-whatsdiff&quot; class=&quot;heading-permalink&quot; aria-hidden=&quot;true&quot; tabindex=&quot;-1&quot; title=&quot;Permalink&quot;&gt;#&lt;/a&gt;What's Whatsdiff?&lt;/h2&gt;
&lt;p&gt;Ever run &lt;code&gt;npm update&lt;/code&gt; or &lt;code&gt;composer update&lt;/code&gt; and wonder what actually changed? Sure, you see package names scroll by, but what releases did you skip? What features or fixes did you get?&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;https://whatsdiff.app&quot;&gt;Whatsdiff&lt;/a&gt; answers that question. It's a CLI tool that compares your dependency files between commits and shows you exactly what changed—with release counts, version ranges, and even full changelogs.&lt;/p&gt;
&lt;h2&gt;&lt;a id=&quot;content-what-it-does&quot; href=&quot;#content-what-it-does&quot; class=&quot;heading-permalink&quot; aria-hidden=&quot;true&quot; tabindex=&quot;-1&quot; title=&quot;Permalink&quot;&gt;#&lt;/a&gt;What It Does&lt;/h2&gt;
&lt;p&gt;At its core, Whatsdiff analyzes &lt;code&gt;composer.lock&lt;/code&gt; and &lt;code&gt;package-lock.json&lt;/code&gt; files between git commits. Run it after an update, and you'll see:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Added, removed, updated, and downgraded packages&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Multiple output formats&lt;/strong&gt;: text, JSON, markdown, or an interactive Terminal UI&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Full release notes&lt;/strong&gt; for any package and version range&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;AI integration&lt;/strong&gt; via an MCP server for assistants like Claude Code&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;&lt;a id=&quot;content-how-to-you-use-it&quot; href=&quot;#content-how-to-you-use-it&quot; class=&quot;heading-permalink&quot; aria-hidden=&quot;true&quot; tabindex=&quot;-1&quot; title=&quot;Permalink&quot;&gt;#&lt;/a&gt;How to you use it?&lt;/h2&gt;
&lt;p&gt;Basic usage is to just run it after an update of your dependencies.&lt;/p&gt;
&lt;div x-data=&quot;codeBlock&quot; class=&quot;code-block relative&quot;&gt;&lt;div class=&quot;flex space-x-2 items-center absolute top-0 right-0&quot;&gt;
    &lt;div x-cloak x-show=&quot;showMessage&quot; x-transition class=&quot;py-2 animate-bounce transition duration-300 mt-1 text-sky-500 text-xs&quot;&gt;Copied!&lt;/div&gt;
    &lt;button
        type=&quot;button&quot;
        title=&quot;Copy to clipboard&quot;
        class=&quot;hidden sm:block p-2 pl-3 transition duration-300&quot;
        @click.prevent=&quot;copyToClipboard&quot;
        :class=&quot;{
            'text-black/30 hover:text-black/80': !showMessage,
            'text-sky-500 hover:text-sky-700': showMessage,
        }&quot;&gt;
        &lt;svg xmlns=&quot;http://www.w3.org/2000/svg&quot; fill=&quot;none&quot; viewBox=&quot;0 0 24 24&quot; stroke-width=&quot;1.5&quot; stroke=&quot;currentColor&quot; class=&quot;block w-6 h-6&quot;&gt;
            &lt;path fill=&quot;white&quot; stroke-linecap=&quot;round&quot; stroke-linejoin=&quot;round&quot; d=&quot;M11.35 3.836c-.065.21-.1.433-.1.664 0 .414.336.75.75.75h4.5a.75.75 0 00.75-.75 2.25 2.25 0 00-.1-.664m-5.8 0A2.251 2.251 0 0113.5 2.25H15c1.012 0 1.867.668 2.15 1.586m-5.8 0c-.376.023-.75.05-1.124.08C9.095 4.01 8.25 4.973 8.25 6.108V8.25m8.9-4.414c.376.023.75.05 1.124.08 1.131.094 1.976 1.057 1.976 2.192V16.5A2.25 2.25 0 0118 18.75h-2.25m-7.5-10.5H4.875c-.621 0-1.125.504-1.125 1.125v11.25c0 .621.504 1.125 1.125 1.125h9.75c.621 0 1.125-.504 1.125-1.125V18.75m-7.5-10.5h6.375c.621 0 1.125.504 1.125 1.125v9.375m-8.25-3l1.5 1.5 3-3.75&quot; /&gt;
        &lt;/svg&gt;
    &lt;/button&gt;
&lt;/div&gt;&lt;pre class=&quot;phiki language-shellscript github-light&quot; data-language=&quot;shellscript&quot; style=&quot;background-color: #fff;color: #24292e;&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;token&quot; style=&quot;color: #6a737d;&quot;&gt;#&lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #6a737d;&quot;&gt; Last update
&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;token&quot; style=&quot;color: #6f42c1;&quot;&gt;whatsdiff&lt;/span&gt;&lt;span class=&quot;token&quot;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;token&quot;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;token&quot; style=&quot;color: #6a737d;&quot;&gt;#&lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #6a737d;&quot;&gt; Between specific commits, tags, or branches
&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;token&quot; style=&quot;color: #6f42c1;&quot;&gt;whatsdiff&lt;/span&gt;&lt;span class=&quot;token&quot;&gt; &lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #032f62;&quot;&gt;between&lt;/span&gt;&lt;span class=&quot;token&quot;&gt; &lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #032f62;&quot;&gt;v1.0.0&lt;/span&gt;&lt;span class=&quot;token&quot;&gt; &lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #032f62;&quot;&gt;v2.0.0&lt;/span&gt;&lt;span class=&quot;token&quot;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;Want to see what's in those 5 Laravel releases?&lt;br /&gt;
It pulls from multiple sources: local vendor directories, GitHub Releases, or repository changelogs.&lt;/p&gt;
&lt;div x-data=&quot;codeBlock&quot; class=&quot;code-block relative&quot;&gt;&lt;div class=&quot;flex space-x-2 items-center absolute top-0 right-0&quot;&gt;
    &lt;div x-cloak x-show=&quot;showMessage&quot; x-transition class=&quot;py-2 animate-bounce transition duration-300 mt-1 text-sky-500 text-xs&quot;&gt;Copied!&lt;/div&gt;
    &lt;button
        type=&quot;button&quot;
        title=&quot;Copy to clipboard&quot;
        class=&quot;hidden sm:block p-2 pl-3 transition duration-300&quot;
        @click.prevent=&quot;copyToClipboard&quot;
        :class=&quot;{
            'text-black/30 hover:text-black/80': !showMessage,
            'text-sky-500 hover:text-sky-700': showMessage,
        }&quot;&gt;
        &lt;svg xmlns=&quot;http://www.w3.org/2000/svg&quot; fill=&quot;none&quot; viewBox=&quot;0 0 24 24&quot; stroke-width=&quot;1.5&quot; stroke=&quot;currentColor&quot; class=&quot;block w-6 h-6&quot;&gt;
            &lt;path fill=&quot;white&quot; stroke-linecap=&quot;round&quot; stroke-linejoin=&quot;round&quot; d=&quot;M11.35 3.836c-.065.21-.1.433-.1.664 0 .414.336.75.75.75h4.5a.75.75 0 00.75-.75 2.25 2.25 0 00-.1-.664m-5.8 0A2.251 2.251 0 0113.5 2.25H15c1.012 0 1.867.668 2.15 1.586m-5.8 0c-.376.023-.75.05-1.124.08C9.095 4.01 8.25 4.973 8.25 6.108V8.25m8.9-4.414c.376.023.75.05 1.124.08 1.131.094 1.976 1.057 1.976 2.192V16.5A2.25 2.25 0 0118 18.75h-2.25m-7.5-10.5H4.875c-.621 0-1.125.504-1.125 1.125v11.25c0 .621.504 1.125 1.125 1.125h9.75c.621 0 1.125-.504 1.125-1.125V18.75m-7.5-10.5h6.375c.621 0 1.125.504 1.125 1.125v9.375m-8.25-3l1.5 1.5 3-3.75&quot; /&gt;
        &lt;/svg&gt;
    &lt;/button&gt;
&lt;/div&gt;&lt;pre class=&quot;phiki language-shellscript github-light&quot; data-language=&quot;shellscript&quot; style=&quot;background-color: #fff;color: #24292e;&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;token&quot; style=&quot;color: #6f42c1;&quot;&gt;whatsdiff&lt;/span&gt;&lt;span class=&quot;token&quot;&gt; &lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #032f62;&quot;&gt;changelog&lt;/span&gt;&lt;span class=&quot;token&quot;&gt; &lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #032f62;&quot;&gt;laravel/framework&lt;/span&gt;&lt;span class=&quot;token&quot;&gt; &lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #032f62;&quot;&gt;12.33.0...12.36.1&lt;/span&gt;&lt;span class=&quot;token&quot;&gt; &lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #005cc5;&quot;&gt;-&lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #005cc5;&quot;&gt;-type=composer&lt;/span&gt;&lt;span class=&quot;token&quot;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;You can also integrate this into CI/CD by using the &lt;code&gt;check&lt;/code&gt; command to detect if specific packages have changed, exit codes make it perfect for automation (0 = true, 1 = false, 2 = error).&lt;/p&gt;
&lt;div x-data=&quot;codeBlock&quot; class=&quot;code-block relative&quot;&gt;&lt;div class=&quot;flex space-x-2 items-center absolute top-0 right-0&quot;&gt;
    &lt;div x-cloak x-show=&quot;showMessage&quot; x-transition class=&quot;py-2 animate-bounce transition duration-300 mt-1 text-sky-500 text-xs&quot;&gt;Copied!&lt;/div&gt;
    &lt;button
        type=&quot;button&quot;
        title=&quot;Copy to clipboard&quot;
        class=&quot;hidden sm:block p-2 pl-3 transition duration-300&quot;
        @click.prevent=&quot;copyToClipboard&quot;
        :class=&quot;{
            'text-black/30 hover:text-black/80': !showMessage,
            'text-sky-500 hover:text-sky-700': showMessage,
        }&quot;&gt;
        &lt;svg xmlns=&quot;http://www.w3.org/2000/svg&quot; fill=&quot;none&quot; viewBox=&quot;0 0 24 24&quot; stroke-width=&quot;1.5&quot; stroke=&quot;currentColor&quot; class=&quot;block w-6 h-6&quot;&gt;
            &lt;path fill=&quot;white&quot; stroke-linecap=&quot;round&quot; stroke-linejoin=&quot;round&quot; d=&quot;M11.35 3.836c-.065.21-.1.433-.1.664 0 .414.336.75.75.75h4.5a.75.75 0 00.75-.75 2.25 2.25 0 00-.1-.664m-5.8 0A2.251 2.251 0 0113.5 2.25H15c1.012 0 1.867.668 2.15 1.586m-5.8 0c-.376.023-.75.05-1.124.08C9.095 4.01 8.25 4.973 8.25 6.108V8.25m8.9-4.414c.376.023.75.05 1.124.08 1.131.094 1.976 1.057 1.976 2.192V16.5A2.25 2.25 0 0118 18.75h-2.25m-7.5-10.5H4.875c-.621 0-1.125.504-1.125 1.125v11.25c0 .621.504 1.125 1.125 1.125h9.75c.621 0 1.125-.504 1.125-1.125V18.75m-7.5-10.5h6.375c.621 0 1.125.504 1.125 1.125v9.375m-8.25-3l1.5 1.5 3-3.75&quot; /&gt;
        &lt;/svg&gt;
    &lt;/button&gt;
&lt;/div&gt;&lt;pre class=&quot;phiki language-shellscript github-light&quot; data-language=&quot;shellscript&quot; style=&quot;background-color: #fff;color: #24292e;&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;token&quot; style=&quot;color: #6a737d;&quot;&gt;#&lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #6a737d;&quot;&gt; Check if a critical package was updated
&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;token&quot; style=&quot;color: #d73a49;&quot;&gt;if&lt;/span&gt;&lt;span class=&quot;token&quot;&gt; &lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #6f42c1;&quot;&gt;whatsdiff&lt;/span&gt;&lt;span class=&quot;token&quot;&gt; &lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #032f62;&quot;&gt;check&lt;/span&gt;&lt;span class=&quot;token&quot;&gt; &lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #032f62;&quot;&gt;livewire/livewire&lt;/span&gt;&lt;span class=&quot;token&quot;&gt; &lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #005cc5;&quot;&gt;-&lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #005cc5;&quot;&gt;-is-updated&lt;/span&gt;&lt;span class=&quot;token&quot;&gt; &lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #005cc5;&quot;&gt;-&lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #005cc5;&quot;&gt;-quiet&lt;/span&gt;&lt;span class=&quot;token&quot;&gt;;&lt;/span&gt;&lt;span class=&quot;token&quot;&gt; &lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #d73a49;&quot;&gt;then&lt;/span&gt;&lt;span class=&quot;token&quot;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;token&quot;&gt;  &lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #005cc5;&quot;&gt;echo&lt;/span&gt;&lt;span class=&quot;token&quot;&gt; &lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #032f62;&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #032f62;&quot;&gt;Running extended test suite...&lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #032f62;&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span class=&quot;token&quot;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;token&quot; style=&quot;color: #d73a49;&quot;&gt;fi&lt;/span&gt;&lt;span class=&quot;token&quot;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;You can also use it to create your own tools, use the JSON output format to create your own tool:&lt;/p&gt;
&lt;div x-data=&quot;codeBlock&quot; class=&quot;code-block relative&quot;&gt;&lt;div class=&quot;flex space-x-2 items-center absolute top-0 right-0&quot;&gt;
    &lt;div x-cloak x-show=&quot;showMessage&quot; x-transition class=&quot;py-2 animate-bounce transition duration-300 mt-1 text-sky-500 text-xs&quot;&gt;Copied!&lt;/div&gt;
    &lt;button
        type=&quot;button&quot;
        title=&quot;Copy to clipboard&quot;
        class=&quot;hidden sm:block p-2 pl-3 transition duration-300&quot;
        @click.prevent=&quot;copyToClipboard&quot;
        :class=&quot;{
            'text-black/30 hover:text-black/80': !showMessage,
            'text-sky-500 hover:text-sky-700': showMessage,
        }&quot;&gt;
        &lt;svg xmlns=&quot;http://www.w3.org/2000/svg&quot; fill=&quot;none&quot; viewBox=&quot;0 0 24 24&quot; stroke-width=&quot;1.5&quot; stroke=&quot;currentColor&quot; class=&quot;block w-6 h-6&quot;&gt;
            &lt;path fill=&quot;white&quot; stroke-linecap=&quot;round&quot; stroke-linejoin=&quot;round&quot; d=&quot;M11.35 3.836c-.065.21-.1.433-.1.664 0 .414.336.75.75.75h4.5a.75.75 0 00.75-.75 2.25 2.25 0 00-.1-.664m-5.8 0A2.251 2.251 0 0113.5 2.25H15c1.012 0 1.867.668 2.15 1.586m-5.8 0c-.376.023-.75.05-1.124.08C9.095 4.01 8.25 4.973 8.25 6.108V8.25m8.9-4.414c.376.023.75.05 1.124.08 1.131.094 1.976 1.057 1.976 2.192V16.5A2.25 2.25 0 0118 18.75h-2.25m-7.5-10.5H4.875c-.621 0-1.125.504-1.125 1.125v11.25c0 .621.504 1.125 1.125 1.125h9.75c.621 0 1.125-.504 1.125-1.125V18.75m-7.5-10.5h6.375c.621 0 1.125.504 1.125 1.125v9.375m-8.25-3l1.5 1.5 3-3.75&quot; /&gt;
        &lt;/svg&gt;
    &lt;/button&gt;
&lt;/div&gt;&lt;pre class=&quot;phiki language-shellscript github-light&quot; data-language=&quot;shellscript&quot; style=&quot;background-color: #fff;color: #24292e;&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;token&quot; style=&quot;color: #6f42c1;&quot;&gt;whatsdiff&lt;/span&gt;&lt;span class=&quot;token&quot;&gt; &lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #005cc5;&quot;&gt;-&lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #005cc5;&quot;&gt;-format=json&lt;/span&gt;&lt;span class=&quot;token&quot;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;h2&gt;&lt;a id=&quot;content-the-real-cool-stuff&quot; href=&quot;#content-the-real-cool-stuff&quot; class=&quot;heading-permalink&quot; aria-hidden=&quot;true&quot; tabindex=&quot;-1&quot; title=&quot;Permalink&quot;&gt;#&lt;/a&gt;The real cool stuff&lt;/h2&gt;
&lt;h3&gt;&lt;a id=&quot;content-terminal-ui&quot; href=&quot;#content-terminal-ui&quot; class=&quot;heading-permalink&quot; aria-hidden=&quot;true&quot; tabindex=&quot;-1&quot; title=&quot;Permalink&quot;&gt;#&lt;/a&gt;Terminal UI&lt;/h3&gt;
&lt;p&gt;Not a fan of scrolling through terminal output? Launch the TUI:&lt;/p&gt;
&lt;div x-data=&quot;codeBlock&quot; class=&quot;code-block relative&quot;&gt;&lt;div class=&quot;flex space-x-2 items-center absolute top-0 right-0&quot;&gt;
    &lt;div x-cloak x-show=&quot;showMessage&quot; x-transition class=&quot;py-2 animate-bounce transition duration-300 mt-1 text-sky-500 text-xs&quot;&gt;Copied!&lt;/div&gt;
    &lt;button
        type=&quot;button&quot;
        title=&quot;Copy to clipboard&quot;
        class=&quot;hidden sm:block p-2 pl-3 transition duration-300&quot;
        @click.prevent=&quot;copyToClipboard&quot;
        :class=&quot;{
            'text-black/30 hover:text-black/80': !showMessage,
            'text-sky-500 hover:text-sky-700': showMessage,
        }&quot;&gt;
        &lt;svg xmlns=&quot;http://www.w3.org/2000/svg&quot; fill=&quot;none&quot; viewBox=&quot;0 0 24 24&quot; stroke-width=&quot;1.5&quot; stroke=&quot;currentColor&quot; class=&quot;block w-6 h-6&quot;&gt;
            &lt;path fill=&quot;white&quot; stroke-linecap=&quot;round&quot; stroke-linejoin=&quot;round&quot; d=&quot;M11.35 3.836c-.065.21-.1.433-.1.664 0 .414.336.75.75.75h4.5a.75.75 0 00.75-.75 2.25 2.25 0 00-.1-.664m-5.8 0A2.251 2.251 0 0113.5 2.25H15c1.012 0 1.867.668 2.15 1.586m-5.8 0c-.376.023-.75.05-1.124.08C9.095 4.01 8.25 4.973 8.25 6.108V8.25m8.9-4.414c.376.023.75.05 1.124.08 1.131.094 1.976 1.057 1.976 2.192V16.5A2.25 2.25 0 0118 18.75h-2.25m-7.5-10.5H4.875c-.621 0-1.125.504-1.125 1.125v11.25c0 .621.504 1.125 1.125 1.125h9.75c.621 0 1.125-.504 1.125-1.125V18.75m-7.5-10.5h6.375c.621 0 1.125.504 1.125 1.125v9.375m-8.25-3l1.5 1.5 3-3.75&quot; /&gt;
        &lt;/svg&gt;
    &lt;/button&gt;
&lt;/div&gt;&lt;pre class=&quot;phiki language-shellscript github-light&quot; data-language=&quot;shellscript&quot; style=&quot;background-color: #fff;color: #24292e;&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;token&quot; style=&quot;color: #6f42c1;&quot;&gt;whatsdiff&lt;/span&gt;&lt;span class=&quot;token&quot;&gt; &lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #032f62;&quot;&gt;tui&lt;/span&gt;&lt;span class=&quot;token&quot;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;Browse packages, view details, and read changelogs with arrow keys and vim-style navigation.&lt;/p&gt;
&lt;h3&gt;&lt;a id=&quot;content-model-context-protocol-mcp-server&quot; href=&quot;#content-model-context-protocol-mcp-server&quot; class=&quot;heading-permalink&quot; aria-hidden=&quot;true&quot; tabindex=&quot;-1&quot; title=&quot;Permalink&quot;&gt;#&lt;/a&gt;Model Context Protocol (MCP) Server&lt;/h3&gt;
&lt;p&gt;For AI-powered workflows, Whatsdiff includes an MCP server that lets AI assistants:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Find compatible versions for dependency constraints&lt;/li&gt;
&lt;li&gt;Fetch release notes between versions&lt;/li&gt;
&lt;li&gt;Check available upgrades (patch, minor, major)&lt;/li&gt;
&lt;li&gt;Analyze dependency trees&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Perfect for integrating with Claude Code or other AI tools.&lt;/p&gt;
&lt;p&gt;This helped Claude Code a lot when I need to upgrade a major version of a framework or a package.&lt;/p&gt;
&lt;h2&gt;&lt;a id=&quot;content-conclusion&quot; href=&quot;#content-conclusion&quot; class=&quot;heading-permalink&quot; aria-hidden=&quot;true&quot; tabindex=&quot;-1&quot; title=&quot;Permalink&quot;&gt;#&lt;/a&gt;Conclusion&lt;/h2&gt;
&lt;p&gt;If you want to give it a try, install it globally via Composer:&lt;/p&gt;
&lt;div x-data=&quot;codeBlock&quot; class=&quot;code-block relative&quot;&gt;&lt;div class=&quot;flex space-x-2 items-center absolute top-0 right-0&quot;&gt;
    &lt;div x-cloak x-show=&quot;showMessage&quot; x-transition class=&quot;py-2 animate-bounce transition duration-300 mt-1 text-sky-500 text-xs&quot;&gt;Copied!&lt;/div&gt;
    &lt;button
        type=&quot;button&quot;
        title=&quot;Copy to clipboard&quot;
        class=&quot;hidden sm:block p-2 pl-3 transition duration-300&quot;
        @click.prevent=&quot;copyToClipboard&quot;
        :class=&quot;{
            'text-black/30 hover:text-black/80': !showMessage,
            'text-sky-500 hover:text-sky-700': showMessage,
        }&quot;&gt;
        &lt;svg xmlns=&quot;http://www.w3.org/2000/svg&quot; fill=&quot;none&quot; viewBox=&quot;0 0 24 24&quot; stroke-width=&quot;1.5&quot; stroke=&quot;currentColor&quot; class=&quot;block w-6 h-6&quot;&gt;
            &lt;path fill=&quot;white&quot; stroke-linecap=&quot;round&quot; stroke-linejoin=&quot;round&quot; d=&quot;M11.35 3.836c-.065.21-.1.433-.1.664 0 .414.336.75.75.75h4.5a.75.75 0 00.75-.75 2.25 2.25 0 00-.1-.664m-5.8 0A2.251 2.251 0 0113.5 2.25H15c1.012 0 1.867.668 2.15 1.586m-5.8 0c-.376.023-.75.05-1.124.08C9.095 4.01 8.25 4.973 8.25 6.108V8.25m8.9-4.414c.376.023.75.05 1.124.08 1.131.094 1.976 1.057 1.976 2.192V16.5A2.25 2.25 0 0118 18.75h-2.25m-7.5-10.5H4.875c-.621 0-1.125.504-1.125 1.125v11.25c0 .621.504 1.125 1.125 1.125h9.75c.621 0 1.125-.504 1.125-1.125V18.75m-7.5-10.5h6.375c.621 0 1.125.504 1.125 1.125v9.375m-8.25-3l1.5 1.5 3-3.75&quot; /&gt;
        &lt;/svg&gt;
    &lt;/button&gt;
&lt;/div&gt;&lt;pre class=&quot;phiki language-shellscript github-light&quot; data-language=&quot;shellscript&quot; style=&quot;background-color: #fff;color: #24292e;&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;token&quot; style=&quot;color: #6f42c1;&quot;&gt;composer&lt;/span&gt;&lt;span class=&quot;token&quot;&gt; &lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #032f62;&quot;&gt;global&lt;/span&gt;&lt;span class=&quot;token&quot;&gt; &lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #032f62;&quot;&gt;require&lt;/span&gt;&lt;span class=&quot;token&quot;&gt; &lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #032f62;&quot;&gt;whatsdiff/whatsdiff&lt;/span&gt;&lt;span class=&quot;token&quot;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;I used it a whole year before talking about it. It's been super helpful to keep track of what changed in my projects.&lt;/p&gt;
&lt;p&gt;When I take on a old project, the first thing I do is update dependencies and run whatsdiff to see what changed.&lt;/p&gt;
&lt;div x-data=&quot;codeBlock&quot; class=&quot;code-block relative&quot;&gt;&lt;div class=&quot;flex space-x-2 items-center absolute top-0 right-0&quot;&gt;
    &lt;div x-cloak x-show=&quot;showMessage&quot; x-transition class=&quot;py-2 animate-bounce transition duration-300 mt-1 text-sky-500 text-xs&quot;&gt;Copied!&lt;/div&gt;
    &lt;button
        type=&quot;button&quot;
        title=&quot;Copy to clipboard&quot;
        class=&quot;hidden sm:block p-2 pl-3 transition duration-300&quot;
        @click.prevent=&quot;copyToClipboard&quot;
        :class=&quot;{
            'text-black/30 hover:text-black/80': !showMessage,
            'text-sky-500 hover:text-sky-700': showMessage,
        }&quot;&gt;
        &lt;svg xmlns=&quot;http://www.w3.org/2000/svg&quot; fill=&quot;none&quot; viewBox=&quot;0 0 24 24&quot; stroke-width=&quot;1.5&quot; stroke=&quot;currentColor&quot; class=&quot;block w-6 h-6&quot;&gt;
            &lt;path fill=&quot;white&quot; stroke-linecap=&quot;round&quot; stroke-linejoin=&quot;round&quot; d=&quot;M11.35 3.836c-.065.21-.1.433-.1.664 0 .414.336.75.75.75h4.5a.75.75 0 00.75-.75 2.25 2.25 0 00-.1-.664m-5.8 0A2.251 2.251 0 0113.5 2.25H15c1.012 0 1.867.668 2.15 1.586m-5.8 0c-.376.023-.75.05-1.124.08C9.095 4.01 8.25 4.973 8.25 6.108V8.25m8.9-4.414c.376.023.75.05 1.124.08 1.131.094 1.976 1.057 1.976 2.192V16.5A2.25 2.25 0 0118 18.75h-2.25m-7.5-10.5H4.875c-.621 0-1.125.504-1.125 1.125v11.25c0 .621.504 1.125 1.125 1.125h9.75c.621 0 1.125-.504 1.125-1.125V18.75m-7.5-10.5h6.375c.621 0 1.125.504 1.125 1.125v9.375m-8.25-3l1.5 1.5 3-3.75&quot; /&gt;
        &lt;/svg&gt;
    &lt;/button&gt;
&lt;/div&gt;&lt;pre class=&quot;phiki language-shellscript github-light&quot; data-language=&quot;shellscript&quot; style=&quot;background-color: #fff;color: #24292e;&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;token&quot; style=&quot;color: #6f42c1;&quot;&gt;npm&lt;/span&gt;&lt;span class=&quot;token&quot;&gt; &lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #032f62;&quot;&gt;update&lt;/span&gt;&lt;span class=&quot;token&quot;&gt; &lt;/span&gt;&lt;span class=&quot;token&quot;&gt;&amp;amp;&amp;amp;&lt;/span&gt;&lt;span class=&quot;token&quot;&gt; &lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #6f42c1;&quot;&gt;composer&lt;/span&gt;&lt;span class=&quot;token&quot;&gt; &lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #032f62;&quot;&gt;update&lt;/span&gt;&lt;span class=&quot;token&quot;&gt; &lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #005cc5;&quot;&gt;-&lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #005cc5;&quot;&gt;W&lt;/span&gt;&lt;span class=&quot;token&quot;&gt; &lt;/span&gt;&lt;span class=&quot;token&quot;&gt;&amp;amp;&amp;amp;&lt;/span&gt;&lt;span class=&quot;token&quot;&gt; &lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #6f42c1;&quot;&gt;npm&lt;/span&gt;&lt;span class=&quot;token&quot;&gt; &lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #032f62;&quot;&gt;run&lt;/span&gt;&lt;span class=&quot;token&quot;&gt; &lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #032f62;&quot;&gt;build&lt;/span&gt;&lt;span class=&quot;token&quot;&gt; &lt;/span&gt;&lt;span class=&quot;token&quot;&gt;&amp;amp;&amp;amp;&lt;/span&gt;&lt;span class=&quot;token&quot;&gt; &lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #6f42c1;&quot;&gt;whatsdiff&lt;/span&gt;&lt;span class=&quot;token&quot;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;Check it out at &lt;a href=&quot;https://whatsdiff.app&quot;&gt;whatsdiff.app&lt;/a&gt; or &lt;a href=&quot;https://github.com/whatsdiff/whatsdiff&quot;&gt;github.com/whatsdiff/whatsdiff&lt;/a&gt;.&lt;/p&gt;</summary>
        <content type="html">&lt;p&gt;I made this tool for myself. After a year of using it, I decided it needed some attention. v2 is here with a website and documentation.&lt;/p&gt;
&lt;!--more--&gt;
&lt;ul class=&quot;table-of-contents not-prose&quot;&gt;
&lt;li&gt;&lt;a href=&quot;#content-whats-whatsdiff&quot;&gt;What's Whatsdiff?&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;#content-what-it-does&quot;&gt;What It Does&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;#content-how-to-you-use-it&quot;&gt;How to you use it?&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;#content-the-real-cool-stuff&quot;&gt;The real cool stuff&lt;/a&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;#content-terminal-ui&quot;&gt;Terminal UI&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;#content-model-context-protocol-mcp-server&quot;&gt;Model Context Protocol (MCP) Server&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;#content-conclusion&quot;&gt;Conclusion&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;&lt;a id=&quot;content-whats-whatsdiff&quot; href=&quot;#content-whats-whatsdiff&quot; class=&quot;heading-permalink&quot; aria-hidden=&quot;true&quot; tabindex=&quot;-1&quot; title=&quot;Permalink&quot;&gt;#&lt;/a&gt;What's Whatsdiff?&lt;/h2&gt;
&lt;p&gt;Ever run &lt;code&gt;npm update&lt;/code&gt; or &lt;code&gt;composer update&lt;/code&gt; and wonder what actually changed? Sure, you see package names scroll by, but what releases did you skip? What features or fixes did you get?&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;https://whatsdiff.app&quot;&gt;Whatsdiff&lt;/a&gt; answers that question. It's a CLI tool that compares your dependency files between commits and shows you exactly what changed—with release counts, version ranges, and even full changelogs.&lt;/p&gt;
&lt;h2&gt;&lt;a id=&quot;content-what-it-does&quot; href=&quot;#content-what-it-does&quot; class=&quot;heading-permalink&quot; aria-hidden=&quot;true&quot; tabindex=&quot;-1&quot; title=&quot;Permalink&quot;&gt;#&lt;/a&gt;What It Does&lt;/h2&gt;
&lt;p&gt;At its core, Whatsdiff analyzes &lt;code&gt;composer.lock&lt;/code&gt; and &lt;code&gt;package-lock.json&lt;/code&gt; files between git commits. Run it after an update, and you'll see:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Added, removed, updated, and downgraded packages&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Multiple output formats&lt;/strong&gt;: text, JSON, markdown, or an interactive Terminal UI&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Full release notes&lt;/strong&gt; for any package and version range&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;AI integration&lt;/strong&gt; via an MCP server for assistants like Claude Code&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;&lt;a id=&quot;content-how-to-you-use-it&quot; href=&quot;#content-how-to-you-use-it&quot; class=&quot;heading-permalink&quot; aria-hidden=&quot;true&quot; tabindex=&quot;-1&quot; title=&quot;Permalink&quot;&gt;#&lt;/a&gt;How to you use it?&lt;/h2&gt;
&lt;p&gt;Basic usage is to just run it after an update of your dependencies.&lt;/p&gt;
&lt;div x-data=&quot;codeBlock&quot; class=&quot;code-block relative&quot;&gt;&lt;div class=&quot;flex space-x-2 items-center absolute top-0 right-0&quot;&gt;
    &lt;div x-cloak x-show=&quot;showMessage&quot; x-transition class=&quot;py-2 animate-bounce transition duration-300 mt-1 text-sky-500 text-xs&quot;&gt;Copied!&lt;/div&gt;
    &lt;button
        type=&quot;button&quot;
        title=&quot;Copy to clipboard&quot;
        class=&quot;hidden sm:block p-2 pl-3 transition duration-300&quot;
        @click.prevent=&quot;copyToClipboard&quot;
        :class=&quot;{
            'text-black/30 hover:text-black/80': !showMessage,
            'text-sky-500 hover:text-sky-700': showMessage,
        }&quot;&gt;
        &lt;svg xmlns=&quot;http://www.w3.org/2000/svg&quot; fill=&quot;none&quot; viewBox=&quot;0 0 24 24&quot; stroke-width=&quot;1.5&quot; stroke=&quot;currentColor&quot; class=&quot;block w-6 h-6&quot;&gt;
            &lt;path fill=&quot;white&quot; stroke-linecap=&quot;round&quot; stroke-linejoin=&quot;round&quot; d=&quot;M11.35 3.836c-.065.21-.1.433-.1.664 0 .414.336.75.75.75h4.5a.75.75 0 00.75-.75 2.25 2.25 0 00-.1-.664m-5.8 0A2.251 2.251 0 0113.5 2.25H15c1.012 0 1.867.668 2.15 1.586m-5.8 0c-.376.023-.75.05-1.124.08C9.095 4.01 8.25 4.973 8.25 6.108V8.25m8.9-4.414c.376.023.75.05 1.124.08 1.131.094 1.976 1.057 1.976 2.192V16.5A2.25 2.25 0 0118 18.75h-2.25m-7.5-10.5H4.875c-.621 0-1.125.504-1.125 1.125v11.25c0 .621.504 1.125 1.125 1.125h9.75c.621 0 1.125-.504 1.125-1.125V18.75m-7.5-10.5h6.375c.621 0 1.125.504 1.125 1.125v9.375m-8.25-3l1.5 1.5 3-3.75&quot; /&gt;
        &lt;/svg&gt;
    &lt;/button&gt;
&lt;/div&gt;&lt;pre class=&quot;phiki language-shellscript github-light&quot; data-language=&quot;shellscript&quot; style=&quot;background-color: #fff;color: #24292e;&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;token&quot; style=&quot;color: #6a737d;&quot;&gt;#&lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #6a737d;&quot;&gt; Last update
&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;token&quot; style=&quot;color: #6f42c1;&quot;&gt;whatsdiff&lt;/span&gt;&lt;span class=&quot;token&quot;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;token&quot;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;token&quot; style=&quot;color: #6a737d;&quot;&gt;#&lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #6a737d;&quot;&gt; Between specific commits, tags, or branches
&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;token&quot; style=&quot;color: #6f42c1;&quot;&gt;whatsdiff&lt;/span&gt;&lt;span class=&quot;token&quot;&gt; &lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #032f62;&quot;&gt;between&lt;/span&gt;&lt;span class=&quot;token&quot;&gt; &lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #032f62;&quot;&gt;v1.0.0&lt;/span&gt;&lt;span class=&quot;token&quot;&gt; &lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #032f62;&quot;&gt;v2.0.0&lt;/span&gt;&lt;span class=&quot;token&quot;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;Want to see what's in those 5 Laravel releases?&lt;br /&gt;
It pulls from multiple sources: local vendor directories, GitHub Releases, or repository changelogs.&lt;/p&gt;
&lt;div x-data=&quot;codeBlock&quot; class=&quot;code-block relative&quot;&gt;&lt;div class=&quot;flex space-x-2 items-center absolute top-0 right-0&quot;&gt;
    &lt;div x-cloak x-show=&quot;showMessage&quot; x-transition class=&quot;py-2 animate-bounce transition duration-300 mt-1 text-sky-500 text-xs&quot;&gt;Copied!&lt;/div&gt;
    &lt;button
        type=&quot;button&quot;
        title=&quot;Copy to clipboard&quot;
        class=&quot;hidden sm:block p-2 pl-3 transition duration-300&quot;
        @click.prevent=&quot;copyToClipboard&quot;
        :class=&quot;{
            'text-black/30 hover:text-black/80': !showMessage,
            'text-sky-500 hover:text-sky-700': showMessage,
        }&quot;&gt;
        &lt;svg xmlns=&quot;http://www.w3.org/2000/svg&quot; fill=&quot;none&quot; viewBox=&quot;0 0 24 24&quot; stroke-width=&quot;1.5&quot; stroke=&quot;currentColor&quot; class=&quot;block w-6 h-6&quot;&gt;
            &lt;path fill=&quot;white&quot; stroke-linecap=&quot;round&quot; stroke-linejoin=&quot;round&quot; d=&quot;M11.35 3.836c-.065.21-.1.433-.1.664 0 .414.336.75.75.75h4.5a.75.75 0 00.75-.75 2.25 2.25 0 00-.1-.664m-5.8 0A2.251 2.251 0 0113.5 2.25H15c1.012 0 1.867.668 2.15 1.586m-5.8 0c-.376.023-.75.05-1.124.08C9.095 4.01 8.25 4.973 8.25 6.108V8.25m8.9-4.414c.376.023.75.05 1.124.08 1.131.094 1.976 1.057 1.976 2.192V16.5A2.25 2.25 0 0118 18.75h-2.25m-7.5-10.5H4.875c-.621 0-1.125.504-1.125 1.125v11.25c0 .621.504 1.125 1.125 1.125h9.75c.621 0 1.125-.504 1.125-1.125V18.75m-7.5-10.5h6.375c.621 0 1.125.504 1.125 1.125v9.375m-8.25-3l1.5 1.5 3-3.75&quot; /&gt;
        &lt;/svg&gt;
    &lt;/button&gt;
&lt;/div&gt;&lt;pre class=&quot;phiki language-shellscript github-light&quot; data-language=&quot;shellscript&quot; style=&quot;background-color: #fff;color: #24292e;&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;token&quot; style=&quot;color: #6f42c1;&quot;&gt;whatsdiff&lt;/span&gt;&lt;span class=&quot;token&quot;&gt; &lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #032f62;&quot;&gt;changelog&lt;/span&gt;&lt;span class=&quot;token&quot;&gt; &lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #032f62;&quot;&gt;laravel/framework&lt;/span&gt;&lt;span class=&quot;token&quot;&gt; &lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #032f62;&quot;&gt;12.33.0...12.36.1&lt;/span&gt;&lt;span class=&quot;token&quot;&gt; &lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #005cc5;&quot;&gt;-&lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #005cc5;&quot;&gt;-type=composer&lt;/span&gt;&lt;span class=&quot;token&quot;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;You can also integrate this into CI/CD by using the &lt;code&gt;check&lt;/code&gt; command to detect if specific packages have changed, exit codes make it perfect for automation (0 = true, 1 = false, 2 = error).&lt;/p&gt;
&lt;div x-data=&quot;codeBlock&quot; class=&quot;code-block relative&quot;&gt;&lt;div class=&quot;flex space-x-2 items-center absolute top-0 right-0&quot;&gt;
    &lt;div x-cloak x-show=&quot;showMessage&quot; x-transition class=&quot;py-2 animate-bounce transition duration-300 mt-1 text-sky-500 text-xs&quot;&gt;Copied!&lt;/div&gt;
    &lt;button
        type=&quot;button&quot;
        title=&quot;Copy to clipboard&quot;
        class=&quot;hidden sm:block p-2 pl-3 transition duration-300&quot;
        @click.prevent=&quot;copyToClipboard&quot;
        :class=&quot;{
            'text-black/30 hover:text-black/80': !showMessage,
            'text-sky-500 hover:text-sky-700': showMessage,
        }&quot;&gt;
        &lt;svg xmlns=&quot;http://www.w3.org/2000/svg&quot; fill=&quot;none&quot; viewBox=&quot;0 0 24 24&quot; stroke-width=&quot;1.5&quot; stroke=&quot;currentColor&quot; class=&quot;block w-6 h-6&quot;&gt;
            &lt;path fill=&quot;white&quot; stroke-linecap=&quot;round&quot; stroke-linejoin=&quot;round&quot; d=&quot;M11.35 3.836c-.065.21-.1.433-.1.664 0 .414.336.75.75.75h4.5a.75.75 0 00.75-.75 2.25 2.25 0 00-.1-.664m-5.8 0A2.251 2.251 0 0113.5 2.25H15c1.012 0 1.867.668 2.15 1.586m-5.8 0c-.376.023-.75.05-1.124.08C9.095 4.01 8.25 4.973 8.25 6.108V8.25m8.9-4.414c.376.023.75.05 1.124.08 1.131.094 1.976 1.057 1.976 2.192V16.5A2.25 2.25 0 0118 18.75h-2.25m-7.5-10.5H4.875c-.621 0-1.125.504-1.125 1.125v11.25c0 .621.504 1.125 1.125 1.125h9.75c.621 0 1.125-.504 1.125-1.125V18.75m-7.5-10.5h6.375c.621 0 1.125.504 1.125 1.125v9.375m-8.25-3l1.5 1.5 3-3.75&quot; /&gt;
        &lt;/svg&gt;
    &lt;/button&gt;
&lt;/div&gt;&lt;pre class=&quot;phiki language-shellscript github-light&quot; data-language=&quot;shellscript&quot; style=&quot;background-color: #fff;color: #24292e;&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;token&quot; style=&quot;color: #6a737d;&quot;&gt;#&lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #6a737d;&quot;&gt; Check if a critical package was updated
&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;token&quot; style=&quot;color: #d73a49;&quot;&gt;if&lt;/span&gt;&lt;span class=&quot;token&quot;&gt; &lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #6f42c1;&quot;&gt;whatsdiff&lt;/span&gt;&lt;span class=&quot;token&quot;&gt; &lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #032f62;&quot;&gt;check&lt;/span&gt;&lt;span class=&quot;token&quot;&gt; &lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #032f62;&quot;&gt;livewire/livewire&lt;/span&gt;&lt;span class=&quot;token&quot;&gt; &lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #005cc5;&quot;&gt;-&lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #005cc5;&quot;&gt;-is-updated&lt;/span&gt;&lt;span class=&quot;token&quot;&gt; &lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #005cc5;&quot;&gt;-&lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #005cc5;&quot;&gt;-quiet&lt;/span&gt;&lt;span class=&quot;token&quot;&gt;;&lt;/span&gt;&lt;span class=&quot;token&quot;&gt; &lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #d73a49;&quot;&gt;then&lt;/span&gt;&lt;span class=&quot;token&quot;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;token&quot;&gt;  &lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #005cc5;&quot;&gt;echo&lt;/span&gt;&lt;span class=&quot;token&quot;&gt; &lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #032f62;&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #032f62;&quot;&gt;Running extended test suite...&lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #032f62;&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span class=&quot;token&quot;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;token&quot; style=&quot;color: #d73a49;&quot;&gt;fi&lt;/span&gt;&lt;span class=&quot;token&quot;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;You can also use it to create your own tools, use the JSON output format to create your own tool:&lt;/p&gt;
&lt;div x-data=&quot;codeBlock&quot; class=&quot;code-block relative&quot;&gt;&lt;div class=&quot;flex space-x-2 items-center absolute top-0 right-0&quot;&gt;
    &lt;div x-cloak x-show=&quot;showMessage&quot; x-transition class=&quot;py-2 animate-bounce transition duration-300 mt-1 text-sky-500 text-xs&quot;&gt;Copied!&lt;/div&gt;
    &lt;button
        type=&quot;button&quot;
        title=&quot;Copy to clipboard&quot;
        class=&quot;hidden sm:block p-2 pl-3 transition duration-300&quot;
        @click.prevent=&quot;copyToClipboard&quot;
        :class=&quot;{
            'text-black/30 hover:text-black/80': !showMessage,
            'text-sky-500 hover:text-sky-700': showMessage,
        }&quot;&gt;
        &lt;svg xmlns=&quot;http://www.w3.org/2000/svg&quot; fill=&quot;none&quot; viewBox=&quot;0 0 24 24&quot; stroke-width=&quot;1.5&quot; stroke=&quot;currentColor&quot; class=&quot;block w-6 h-6&quot;&gt;
            &lt;path fill=&quot;white&quot; stroke-linecap=&quot;round&quot; stroke-linejoin=&quot;round&quot; d=&quot;M11.35 3.836c-.065.21-.1.433-.1.664 0 .414.336.75.75.75h4.5a.75.75 0 00.75-.75 2.25 2.25 0 00-.1-.664m-5.8 0A2.251 2.251 0 0113.5 2.25H15c1.012 0 1.867.668 2.15 1.586m-5.8 0c-.376.023-.75.05-1.124.08C9.095 4.01 8.25 4.973 8.25 6.108V8.25m8.9-4.414c.376.023.75.05 1.124.08 1.131.094 1.976 1.057 1.976 2.192V16.5A2.25 2.25 0 0118 18.75h-2.25m-7.5-10.5H4.875c-.621 0-1.125.504-1.125 1.125v11.25c0 .621.504 1.125 1.125 1.125h9.75c.621 0 1.125-.504 1.125-1.125V18.75m-7.5-10.5h6.375c.621 0 1.125.504 1.125 1.125v9.375m-8.25-3l1.5 1.5 3-3.75&quot; /&gt;
        &lt;/svg&gt;
    &lt;/button&gt;
&lt;/div&gt;&lt;pre class=&quot;phiki language-shellscript github-light&quot; data-language=&quot;shellscript&quot; style=&quot;background-color: #fff;color: #24292e;&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;token&quot; style=&quot;color: #6f42c1;&quot;&gt;whatsdiff&lt;/span&gt;&lt;span class=&quot;token&quot;&gt; &lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #005cc5;&quot;&gt;-&lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #005cc5;&quot;&gt;-format=json&lt;/span&gt;&lt;span class=&quot;token&quot;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;h2&gt;&lt;a id=&quot;content-the-real-cool-stuff&quot; href=&quot;#content-the-real-cool-stuff&quot; class=&quot;heading-permalink&quot; aria-hidden=&quot;true&quot; tabindex=&quot;-1&quot; title=&quot;Permalink&quot;&gt;#&lt;/a&gt;The real cool stuff&lt;/h2&gt;
&lt;h3&gt;&lt;a id=&quot;content-terminal-ui&quot; href=&quot;#content-terminal-ui&quot; class=&quot;heading-permalink&quot; aria-hidden=&quot;true&quot; tabindex=&quot;-1&quot; title=&quot;Permalink&quot;&gt;#&lt;/a&gt;Terminal UI&lt;/h3&gt;
&lt;p&gt;Not a fan of scrolling through terminal output? Launch the TUI:&lt;/p&gt;
&lt;div x-data=&quot;codeBlock&quot; class=&quot;code-block relative&quot;&gt;&lt;div class=&quot;flex space-x-2 items-center absolute top-0 right-0&quot;&gt;
    &lt;div x-cloak x-show=&quot;showMessage&quot; x-transition class=&quot;py-2 animate-bounce transition duration-300 mt-1 text-sky-500 text-xs&quot;&gt;Copied!&lt;/div&gt;
    &lt;button
        type=&quot;button&quot;
        title=&quot;Copy to clipboard&quot;
        class=&quot;hidden sm:block p-2 pl-3 transition duration-300&quot;
        @click.prevent=&quot;copyToClipboard&quot;
        :class=&quot;{
            'text-black/30 hover:text-black/80': !showMessage,
            'text-sky-500 hover:text-sky-700': showMessage,
        }&quot;&gt;
        &lt;svg xmlns=&quot;http://www.w3.org/2000/svg&quot; fill=&quot;none&quot; viewBox=&quot;0 0 24 24&quot; stroke-width=&quot;1.5&quot; stroke=&quot;currentColor&quot; class=&quot;block w-6 h-6&quot;&gt;
            &lt;path fill=&quot;white&quot; stroke-linecap=&quot;round&quot; stroke-linejoin=&quot;round&quot; d=&quot;M11.35 3.836c-.065.21-.1.433-.1.664 0 .414.336.75.75.75h4.5a.75.75 0 00.75-.75 2.25 2.25 0 00-.1-.664m-5.8 0A2.251 2.251 0 0113.5 2.25H15c1.012 0 1.867.668 2.15 1.586m-5.8 0c-.376.023-.75.05-1.124.08C9.095 4.01 8.25 4.973 8.25 6.108V8.25m8.9-4.414c.376.023.75.05 1.124.08 1.131.094 1.976 1.057 1.976 2.192V16.5A2.25 2.25 0 0118 18.75h-2.25m-7.5-10.5H4.875c-.621 0-1.125.504-1.125 1.125v11.25c0 .621.504 1.125 1.125 1.125h9.75c.621 0 1.125-.504 1.125-1.125V18.75m-7.5-10.5h6.375c.621 0 1.125.504 1.125 1.125v9.375m-8.25-3l1.5 1.5 3-3.75&quot; /&gt;
        &lt;/svg&gt;
    &lt;/button&gt;
&lt;/div&gt;&lt;pre class=&quot;phiki language-shellscript github-light&quot; data-language=&quot;shellscript&quot; style=&quot;background-color: #fff;color: #24292e;&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;token&quot; style=&quot;color: #6f42c1;&quot;&gt;whatsdiff&lt;/span&gt;&lt;span class=&quot;token&quot;&gt; &lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #032f62;&quot;&gt;tui&lt;/span&gt;&lt;span class=&quot;token&quot;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;Browse packages, view details, and read changelogs with arrow keys and vim-style navigation.&lt;/p&gt;
&lt;h3&gt;&lt;a id=&quot;content-model-context-protocol-mcp-server&quot; href=&quot;#content-model-context-protocol-mcp-server&quot; class=&quot;heading-permalink&quot; aria-hidden=&quot;true&quot; tabindex=&quot;-1&quot; title=&quot;Permalink&quot;&gt;#&lt;/a&gt;Model Context Protocol (MCP) Server&lt;/h3&gt;
&lt;p&gt;For AI-powered workflows, Whatsdiff includes an MCP server that lets AI assistants:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Find compatible versions for dependency constraints&lt;/li&gt;
&lt;li&gt;Fetch release notes between versions&lt;/li&gt;
&lt;li&gt;Check available upgrades (patch, minor, major)&lt;/li&gt;
&lt;li&gt;Analyze dependency trees&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Perfect for integrating with Claude Code or other AI tools.&lt;/p&gt;
&lt;p&gt;This helped Claude Code a lot when I need to upgrade a major version of a framework or a package.&lt;/p&gt;
&lt;h2&gt;&lt;a id=&quot;content-conclusion&quot; href=&quot;#content-conclusion&quot; class=&quot;heading-permalink&quot; aria-hidden=&quot;true&quot; tabindex=&quot;-1&quot; title=&quot;Permalink&quot;&gt;#&lt;/a&gt;Conclusion&lt;/h2&gt;
&lt;p&gt;If you want to give it a try, install it globally via Composer:&lt;/p&gt;
&lt;div x-data=&quot;codeBlock&quot; class=&quot;code-block relative&quot;&gt;&lt;div class=&quot;flex space-x-2 items-center absolute top-0 right-0&quot;&gt;
    &lt;div x-cloak x-show=&quot;showMessage&quot; x-transition class=&quot;py-2 animate-bounce transition duration-300 mt-1 text-sky-500 text-xs&quot;&gt;Copied!&lt;/div&gt;
    &lt;button
        type=&quot;button&quot;
        title=&quot;Copy to clipboard&quot;
        class=&quot;hidden sm:block p-2 pl-3 transition duration-300&quot;
        @click.prevent=&quot;copyToClipboard&quot;
        :class=&quot;{
            'text-black/30 hover:text-black/80': !showMessage,
            'text-sky-500 hover:text-sky-700': showMessage,
        }&quot;&gt;
        &lt;svg xmlns=&quot;http://www.w3.org/2000/svg&quot; fill=&quot;none&quot; viewBox=&quot;0 0 24 24&quot; stroke-width=&quot;1.5&quot; stroke=&quot;currentColor&quot; class=&quot;block w-6 h-6&quot;&gt;
            &lt;path fill=&quot;white&quot; stroke-linecap=&quot;round&quot; stroke-linejoin=&quot;round&quot; d=&quot;M11.35 3.836c-.065.21-.1.433-.1.664 0 .414.336.75.75.75h4.5a.75.75 0 00.75-.75 2.25 2.25 0 00-.1-.664m-5.8 0A2.251 2.251 0 0113.5 2.25H15c1.012 0 1.867.668 2.15 1.586m-5.8 0c-.376.023-.75.05-1.124.08C9.095 4.01 8.25 4.973 8.25 6.108V8.25m8.9-4.414c.376.023.75.05 1.124.08 1.131.094 1.976 1.057 1.976 2.192V16.5A2.25 2.25 0 0118 18.75h-2.25m-7.5-10.5H4.875c-.621 0-1.125.504-1.125 1.125v11.25c0 .621.504 1.125 1.125 1.125h9.75c.621 0 1.125-.504 1.125-1.125V18.75m-7.5-10.5h6.375c.621 0 1.125.504 1.125 1.125v9.375m-8.25-3l1.5 1.5 3-3.75&quot; /&gt;
        &lt;/svg&gt;
    &lt;/button&gt;
&lt;/div&gt;&lt;pre class=&quot;phiki language-shellscript github-light&quot; data-language=&quot;shellscript&quot; style=&quot;background-color: #fff;color: #24292e;&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;token&quot; style=&quot;color: #6f42c1;&quot;&gt;composer&lt;/span&gt;&lt;span class=&quot;token&quot;&gt; &lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #032f62;&quot;&gt;global&lt;/span&gt;&lt;span class=&quot;token&quot;&gt; &lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #032f62;&quot;&gt;require&lt;/span&gt;&lt;span class=&quot;token&quot;&gt; &lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #032f62;&quot;&gt;whatsdiff/whatsdiff&lt;/span&gt;&lt;span class=&quot;token&quot;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;I used it a whole year before talking about it. It's been super helpful to keep track of what changed in my projects.&lt;/p&gt;
&lt;p&gt;When I take on a old project, the first thing I do is update dependencies and run whatsdiff to see what changed.&lt;/p&gt;
&lt;div x-data=&quot;codeBlock&quot; class=&quot;code-block relative&quot;&gt;&lt;div class=&quot;flex space-x-2 items-center absolute top-0 right-0&quot;&gt;
    &lt;div x-cloak x-show=&quot;showMessage&quot; x-transition class=&quot;py-2 animate-bounce transition duration-300 mt-1 text-sky-500 text-xs&quot;&gt;Copied!&lt;/div&gt;
    &lt;button
        type=&quot;button&quot;
        title=&quot;Copy to clipboard&quot;
        class=&quot;hidden sm:block p-2 pl-3 transition duration-300&quot;
        @click.prevent=&quot;copyToClipboard&quot;
        :class=&quot;{
            'text-black/30 hover:text-black/80': !showMessage,
            'text-sky-500 hover:text-sky-700': showMessage,
        }&quot;&gt;
        &lt;svg xmlns=&quot;http://www.w3.org/2000/svg&quot; fill=&quot;none&quot; viewBox=&quot;0 0 24 24&quot; stroke-width=&quot;1.5&quot; stroke=&quot;currentColor&quot; class=&quot;block w-6 h-6&quot;&gt;
            &lt;path fill=&quot;white&quot; stroke-linecap=&quot;round&quot; stroke-linejoin=&quot;round&quot; d=&quot;M11.35 3.836c-.065.21-.1.433-.1.664 0 .414.336.75.75.75h4.5a.75.75 0 00.75-.75 2.25 2.25 0 00-.1-.664m-5.8 0A2.251 2.251 0 0113.5 2.25H15c1.012 0 1.867.668 2.15 1.586m-5.8 0c-.376.023-.75.05-1.124.08C9.095 4.01 8.25 4.973 8.25 6.108V8.25m8.9-4.414c.376.023.75.05 1.124.08 1.131.094 1.976 1.057 1.976 2.192V16.5A2.25 2.25 0 0118 18.75h-2.25m-7.5-10.5H4.875c-.621 0-1.125.504-1.125 1.125v11.25c0 .621.504 1.125 1.125 1.125h9.75c.621 0 1.125-.504 1.125-1.125V18.75m-7.5-10.5h6.375c.621 0 1.125.504 1.125 1.125v9.375m-8.25-3l1.5 1.5 3-3.75&quot; /&gt;
        &lt;/svg&gt;
    &lt;/button&gt;
&lt;/div&gt;&lt;pre class=&quot;phiki language-shellscript github-light&quot; data-language=&quot;shellscript&quot; style=&quot;background-color: #fff;color: #24292e;&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;token&quot; style=&quot;color: #6f42c1;&quot;&gt;npm&lt;/span&gt;&lt;span class=&quot;token&quot;&gt; &lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #032f62;&quot;&gt;update&lt;/span&gt;&lt;span class=&quot;token&quot;&gt; &lt;/span&gt;&lt;span class=&quot;token&quot;&gt;&amp;amp;&amp;amp;&lt;/span&gt;&lt;span class=&quot;token&quot;&gt; &lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #6f42c1;&quot;&gt;composer&lt;/span&gt;&lt;span class=&quot;token&quot;&gt; &lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #032f62;&quot;&gt;update&lt;/span&gt;&lt;span class=&quot;token&quot;&gt; &lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #005cc5;&quot;&gt;-&lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #005cc5;&quot;&gt;W&lt;/span&gt;&lt;span class=&quot;token&quot;&gt; &lt;/span&gt;&lt;span class=&quot;token&quot;&gt;&amp;amp;&amp;amp;&lt;/span&gt;&lt;span class=&quot;token&quot;&gt; &lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #6f42c1;&quot;&gt;npm&lt;/span&gt;&lt;span class=&quot;token&quot;&gt; &lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #032f62;&quot;&gt;run&lt;/span&gt;&lt;span class=&quot;token&quot;&gt; &lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #032f62;&quot;&gt;build&lt;/span&gt;&lt;span class=&quot;token&quot;&gt; &lt;/span&gt;&lt;span class=&quot;token&quot;&gt;&amp;amp;&amp;amp;&lt;/span&gt;&lt;span class=&quot;token&quot;&gt; &lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #6f42c1;&quot;&gt;whatsdiff&lt;/span&gt;&lt;span class=&quot;token&quot;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;Check it out at &lt;a href=&quot;https://whatsdiff.app&quot;&gt;whatsdiff.app&lt;/a&gt; or &lt;a href=&quot;https://github.com/whatsdiff/whatsdiff&quot;&gt;github.com/whatsdiff/whatsdiff&lt;/a&gt;.&lt;/p&gt;</content>
        <author>
            <name>Eser DENIZ</name>
        </author>
    </entry>
    <entry>
        <title type="text">Your small VPS is almost full, clean up your journal logs</title>
        <link href="https://srwiez.com/posts/your-small-vps-is-almost-full-clean-up-your-journal-logs"/>
        <id>https://srwiez.com/posts/your-small-vps-is-almost-full-clean-up-your-journal-logs</id>
        <published>2025-10-21T00:00:00+00:00</published>
        <updated>2025-10-21T08:08:53+00:00</updated>
        <summary type="text">&lt;p&gt;Running a small VPS for your side projects? You might notice your disk filling up mysteriously. Before upgrading your plan or deleting important files, check your systemd journal logs – they're often the silent disk space killer.&lt;/p&gt;
&lt;ul class=&quot;table-of-contents not-prose&quot;&gt;
&lt;li&gt;&lt;a href=&quot;#content-the-problem&quot;&gt;The problem&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;#content-immediate-fix&quot;&gt;Immediate fix&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;#content-permanent-fix--limit-current-log-growth&quot;&gt;Permanent fix – Limit current log growth&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;&lt;a id=&quot;content-the-problem&quot; href=&quot;#content-the-problem&quot; class=&quot;heading-permalink&quot; aria-hidden=&quot;true&quot; tabindex=&quot;-1&quot; title=&quot;Permalink&quot;&gt;#&lt;/a&gt;The problem&lt;/h2&gt;
&lt;p&gt;By default, systemd journal logs everything: every service start, every error, every SSH attempt. On a small VPS, these logs can grow to several gigabytes without you noticing.&lt;/p&gt;
&lt;p&gt;Check your current journal size:&lt;/p&gt;
&lt;div x-data=&quot;codeBlock&quot; class=&quot;code-block relative&quot;&gt;&lt;div class=&quot;flex space-x-2 items-center absolute top-0 right-0&quot;&gt;
    &lt;div x-cloak x-show=&quot;showMessage&quot; x-transition class=&quot;py-2 animate-bounce transition duration-300 mt-1 text-sky-500 text-xs&quot;&gt;Copied!&lt;/div&gt;
    &lt;button
        type=&quot;button&quot;
        title=&quot;Copy to clipboard&quot;
        class=&quot;hidden sm:block p-2 pl-3 transition duration-300&quot;
        @click.prevent=&quot;copyToClipboard&quot;
        :class=&quot;{
            'text-black/30 hover:text-black/80': !showMessage,
            'text-sky-500 hover:text-sky-700': showMessage,
        }&quot;&gt;
        &lt;svg xmlns=&quot;http://www.w3.org/2000/svg&quot; fill=&quot;none&quot; viewBox=&quot;0 0 24 24&quot; stroke-width=&quot;1.5&quot; stroke=&quot;currentColor&quot; class=&quot;block w-6 h-6&quot;&gt;
            &lt;path fill=&quot;white&quot; stroke-linecap=&quot;round&quot; stroke-linejoin=&quot;round&quot; d=&quot;M11.35 3.836c-.065.21-.1.433-.1.664 0 .414.336.75.75.75h4.5a.75.75 0 00.75-.75 2.25 2.25 0 00-.1-.664m-5.8 0A2.251 2.251 0 0113.5 2.25H15c1.012 0 1.867.668 2.15 1.586m-5.8 0c-.376.023-.75.05-1.124.08C9.095 4.01 8.25 4.973 8.25 6.108V8.25m8.9-4.414c.376.023.75.05 1.124.08 1.131.094 1.976 1.057 1.976 2.192V16.5A2.25 2.25 0 0118 18.75h-2.25m-7.5-10.5H4.875c-.621 0-1.125.504-1.125 1.125v11.25c0 .621.504 1.125 1.125 1.125h9.75c.621 0 1.125-.504 1.125-1.125V18.75m-7.5-10.5h6.375c.621 0 1.125.504 1.125 1.125v9.375m-8.25-3l1.5 1.5 3-3.75&quot; /&gt;
        &lt;/svg&gt;
    &lt;/button&gt;
&lt;/div&gt;&lt;pre class=&quot;phiki language-shellscript github-light&quot; data-language=&quot;shellscript&quot; style=&quot;background-color: #fff;color: #24292e;&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;token&quot; style=&quot;color: #6f42c1;&quot;&gt;sudo&lt;/span&gt;&lt;span class=&quot;token&quot;&gt; &lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #032f62;&quot;&gt;journalctl&lt;/span&gt;&lt;span class=&quot;token&quot;&gt; &lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #005cc5;&quot;&gt;-&lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #005cc5;&quot;&gt;-disk-usage&lt;/span&gt;&lt;span class=&quot;token&quot;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;If you see anything over 1GB on a small VPS, you're wasting precious disk space.&lt;/p&gt;
&lt;p&gt;In my case, &lt;code&gt;/var/log/journal&lt;/code&gt; was eating &lt;strong&gt;3.1GB&lt;/strong&gt; on a &lt;strong&gt;25GB VPS&lt;/strong&gt;. That's &lt;strong&gt;12%&lt;/strong&gt; of my total disk space!&lt;/p&gt;
&lt;h2&gt;&lt;a id=&quot;content-immediate-fix&quot; href=&quot;#content-immediate-fix&quot; class=&quot;heading-permalink&quot; aria-hidden=&quot;true&quot; tabindex=&quot;-1&quot; title=&quot;Permalink&quot;&gt;#&lt;/a&gt;Immediate fix&lt;/h2&gt;
&lt;p&gt;Clean up old logs by deleting logs older than a certain time or limiting the total size:&lt;/p&gt;
&lt;div x-data=&quot;codeBlock&quot; class=&quot;code-block relative&quot;&gt;&lt;div class=&quot;flex space-x-2 items-center absolute top-0 right-0&quot;&gt;
    &lt;div x-cloak x-show=&quot;showMessage&quot; x-transition class=&quot;py-2 animate-bounce transition duration-300 mt-1 text-sky-500 text-xs&quot;&gt;Copied!&lt;/div&gt;
    &lt;button
        type=&quot;button&quot;
        title=&quot;Copy to clipboard&quot;
        class=&quot;hidden sm:block p-2 pl-3 transition duration-300&quot;
        @click.prevent=&quot;copyToClipboard&quot;
        :class=&quot;{
            'text-black/30 hover:text-black/80': !showMessage,
            'text-sky-500 hover:text-sky-700': showMessage,
        }&quot;&gt;
        &lt;svg xmlns=&quot;http://www.w3.org/2000/svg&quot; fill=&quot;none&quot; viewBox=&quot;0 0 24 24&quot; stroke-width=&quot;1.5&quot; stroke=&quot;currentColor&quot; class=&quot;block w-6 h-6&quot;&gt;
            &lt;path fill=&quot;white&quot; stroke-linecap=&quot;round&quot; stroke-linejoin=&quot;round&quot; d=&quot;M11.35 3.836c-.065.21-.1.433-.1.664 0 .414.336.75.75.75h4.5a.75.75 0 00.75-.75 2.25 2.25 0 00-.1-.664m-5.8 0A2.251 2.251 0 0113.5 2.25H15c1.012 0 1.867.668 2.15 1.586m-5.8 0c-.376.023-.75.05-1.124.08C9.095 4.01 8.25 4.973 8.25 6.108V8.25m8.9-4.414c.376.023.75.05 1.124.08 1.131.094 1.976 1.057 1.976 2.192V16.5A2.25 2.25 0 0118 18.75h-2.25m-7.5-10.5H4.875c-.621 0-1.125.504-1.125 1.125v11.25c0 .621.504 1.125 1.125 1.125h9.75c.621 0 1.125-.504 1.125-1.125V18.75m-7.5-10.5h6.375c.621 0 1.125.504 1.125 1.125v9.375m-8.25-3l1.5 1.5 3-3.75&quot; /&gt;
        &lt;/svg&gt;
    &lt;/button&gt;
&lt;/div&gt;&lt;pre class=&quot;phiki language-shellscript github-light&quot; data-language=&quot;shellscript&quot; style=&quot;background-color: #fff;color: #24292e;&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;token&quot; style=&quot;color: #6f42c1;&quot;&gt;sudo&lt;/span&gt;&lt;span class=&quot;token&quot;&gt; &lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #032f62;&quot;&gt;journalctl&lt;/span&gt;&lt;span class=&quot;token&quot;&gt; &lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #005cc5;&quot;&gt;-&lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #005cc5;&quot;&gt;-vacuum-time=7d&lt;/span&gt;&lt;span class=&quot;token&quot;&gt; &lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #6a737d;&quot;&gt;#&lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #6a737d;&quot;&gt; keep only last 7 days
&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;token&quot; style=&quot;color: #6f42c1;&quot;&gt;sudo&lt;/span&gt;&lt;span class=&quot;token&quot;&gt; &lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #032f62;&quot;&gt;journalctl&lt;/span&gt;&lt;span class=&quot;token&quot;&gt; &lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #005cc5;&quot;&gt;-&lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #005cc5;&quot;&gt;-vacuum-size=500M&lt;/span&gt;&lt;span class=&quot;token&quot;&gt; &lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #6a737d;&quot;&gt;#&lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #6a737d;&quot;&gt; keep only 500MB of logs
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;h2&gt;&lt;a id=&quot;content-permanent-fix--limit-current-log-growth&quot; href=&quot;#content-permanent-fix--limit-current-log-growth&quot; class=&quot;heading-permalink&quot; aria-hidden=&quot;true&quot; tabindex=&quot;-1&quot; title=&quot;Permalink&quot;&gt;#&lt;/a&gt;Permanent fix – Limit current log growth&lt;/h2&gt;
&lt;p&gt;To prevent this from happening again, you can configure systemd to limit the size and retention of journal logs.&lt;/p&gt;
&lt;p&gt;Edit the journal configuration:&lt;/p&gt;
&lt;div x-data=&quot;codeBlock&quot; class=&quot;code-block relative&quot;&gt;&lt;div class=&quot;flex space-x-2 items-center absolute top-0 right-0&quot;&gt;
    &lt;div x-cloak x-show=&quot;showMessage&quot; x-transition class=&quot;py-2 animate-bounce transition duration-300 mt-1 text-sky-500 text-xs&quot;&gt;Copied!&lt;/div&gt;
    &lt;button
        type=&quot;button&quot;
        title=&quot;Copy to clipboard&quot;
        class=&quot;hidden sm:block p-2 pl-3 transition duration-300&quot;
        @click.prevent=&quot;copyToClipboard&quot;
        :class=&quot;{
            'text-black/30 hover:text-black/80': !showMessage,
            'text-sky-500 hover:text-sky-700': showMessage,
        }&quot;&gt;
        &lt;svg xmlns=&quot;http://www.w3.org/2000/svg&quot; fill=&quot;none&quot; viewBox=&quot;0 0 24 24&quot; stroke-width=&quot;1.5&quot; stroke=&quot;currentColor&quot; class=&quot;block w-6 h-6&quot;&gt;
            &lt;path fill=&quot;white&quot; stroke-linecap=&quot;round&quot; stroke-linejoin=&quot;round&quot; d=&quot;M11.35 3.836c-.065.21-.1.433-.1.664 0 .414.336.75.75.75h4.5a.75.75 0 00.75-.75 2.25 2.25 0 00-.1-.664m-5.8 0A2.251 2.251 0 0113.5 2.25H15c1.012 0 1.867.668 2.15 1.586m-5.8 0c-.376.023-.75.05-1.124.08C9.095 4.01 8.25 4.973 8.25 6.108V8.25m8.9-4.414c.376.023.75.05 1.124.08 1.131.094 1.976 1.057 1.976 2.192V16.5A2.25 2.25 0 0118 18.75h-2.25m-7.5-10.5H4.875c-.621 0-1.125.504-1.125 1.125v11.25c0 .621.504 1.125 1.125 1.125h9.75c.621 0 1.125-.504 1.125-1.125V18.75m-7.5-10.5h6.375c.621 0 1.125.504 1.125 1.125v9.375m-8.25-3l1.5 1.5 3-3.75&quot; /&gt;
        &lt;/svg&gt;
    &lt;/button&gt;
&lt;/div&gt;&lt;pre class=&quot;phiki language-shellscript github-light&quot; data-language=&quot;shellscript&quot; style=&quot;background-color: #fff;color: #24292e;&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;token&quot; style=&quot;color: #6f42c1;&quot;&gt;sudo&lt;/span&gt;&lt;span class=&quot;token&quot;&gt; &lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #032f62;&quot;&gt;nano&lt;/span&gt;&lt;span class=&quot;token&quot;&gt; &lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #032f62;&quot;&gt;/etc/systemd/journald.conf&lt;/span&gt;&lt;span class=&quot;token&quot;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;Uncomment and adjust these values to your preference:&lt;/p&gt;
&lt;div x-data=&quot;codeBlock&quot; class=&quot;code-block relative&quot;&gt;&lt;div class=&quot;flex space-x-2 items-center absolute top-0 right-0&quot;&gt;
    &lt;div x-cloak x-show=&quot;showMessage&quot; x-transition class=&quot;py-2 animate-bounce transition duration-300 mt-1 text-sky-500 text-xs&quot;&gt;Copied!&lt;/div&gt;
    &lt;button
        type=&quot;button&quot;
        title=&quot;Copy to clipboard&quot;
        class=&quot;hidden sm:block p-2 pl-3 transition duration-300&quot;
        @click.prevent=&quot;copyToClipboard&quot;
        :class=&quot;{
            'text-black/30 hover:text-black/80': !showMessage,
            'text-sky-500 hover:text-sky-700': showMessage,
        }&quot;&gt;
        &lt;svg xmlns=&quot;http://www.w3.org/2000/svg&quot; fill=&quot;none&quot; viewBox=&quot;0 0 24 24&quot; stroke-width=&quot;1.5&quot; stroke=&quot;currentColor&quot; class=&quot;block w-6 h-6&quot;&gt;
            &lt;path fill=&quot;white&quot; stroke-linecap=&quot;round&quot; stroke-linejoin=&quot;round&quot; d=&quot;M11.35 3.836c-.065.21-.1.433-.1.664 0 .414.336.75.75.75h4.5a.75.75 0 00.75-.75 2.25 2.25 0 00-.1-.664m-5.8 0A2.251 2.251 0 0113.5 2.25H15c1.012 0 1.867.668 2.15 1.586m-5.8 0c-.376.023-.75.05-1.124.08C9.095 4.01 8.25 4.973 8.25 6.108V8.25m8.9-4.414c.376.023.75.05 1.124.08 1.131.094 1.976 1.057 1.976 2.192V16.5A2.25 2.25 0 0118 18.75h-2.25m-7.5-10.5H4.875c-.621 0-1.125.504-1.125 1.125v11.25c0 .621.504 1.125 1.125 1.125h9.75c.621 0 1.125-.504 1.125-1.125V18.75m-7.5-10.5h6.375c.621 0 1.125.504 1.125 1.125v9.375m-8.25-3l1.5 1.5 3-3.75&quot; /&gt;
        &lt;/svg&gt;
    &lt;/button&gt;
&lt;/div&gt;&lt;pre class=&quot;phiki language-shellscript github-light&quot; data-language=&quot;shellscript&quot; style=&quot;background-color: #fff;color: #24292e;&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;token&quot; style=&quot;color: #24292e;&quot;&gt;SystemMaxUse&lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #d73a49;&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #032f62;&quot;&gt;5&lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #032f62;&quot;&gt;0&lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #032f62;&quot;&gt;0&lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #032f62;&quot;&gt;M&lt;/span&gt;&lt;span class=&quot;token&quot;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;token&quot; style=&quot;color: #24292e;&quot;&gt;SystemKeepFree&lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #d73a49;&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #032f62;&quot;&gt;1&lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #032f62;&quot;&gt;G&lt;/span&gt;&lt;span class=&quot;token&quot;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;token&quot; style=&quot;color: #24292e;&quot;&gt;MaxRetentionSec&lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #d73a49;&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #032f62;&quot;&gt;7&lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #032f62;&quot;&gt;d&lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #032f62;&quot;&gt;a&lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #032f62;&quot;&gt;y&lt;/span&gt;&lt;span class=&quot;token&quot;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;Restart the service:&lt;/p&gt;
&lt;div x-data=&quot;codeBlock&quot; class=&quot;code-block relative&quot;&gt;&lt;div class=&quot;flex space-x-2 items-center absolute top-0 right-0&quot;&gt;
    &lt;div x-cloak x-show=&quot;showMessage&quot; x-transition class=&quot;py-2 animate-bounce transition duration-300 mt-1 text-sky-500 text-xs&quot;&gt;Copied!&lt;/div&gt;
    &lt;button
        type=&quot;button&quot;
        title=&quot;Copy to clipboard&quot;
        class=&quot;hidden sm:block p-2 pl-3 transition duration-300&quot;
        @click.prevent=&quot;copyToClipboard&quot;
        :class=&quot;{
            'text-black/30 hover:text-black/80': !showMessage,
            'text-sky-500 hover:text-sky-700': showMessage,
        }&quot;&gt;
        &lt;svg xmlns=&quot;http://www.w3.org/2000/svg&quot; fill=&quot;none&quot; viewBox=&quot;0 0 24 24&quot; stroke-width=&quot;1.5&quot; stroke=&quot;currentColor&quot; class=&quot;block w-6 h-6&quot;&gt;
            &lt;path fill=&quot;white&quot; stroke-linecap=&quot;round&quot; stroke-linejoin=&quot;round&quot; d=&quot;M11.35 3.836c-.065.21-.1.433-.1.664 0 .414.336.75.75.75h4.5a.75.75 0 00.75-.75 2.25 2.25 0 00-.1-.664m-5.8 0A2.251 2.251 0 0113.5 2.25H15c1.012 0 1.867.668 2.15 1.586m-5.8 0c-.376.023-.75.05-1.124.08C9.095 4.01 8.25 4.973 8.25 6.108V8.25m8.9-4.414c.376.023.75.05 1.124.08 1.131.094 1.976 1.057 1.976 2.192V16.5A2.25 2.25 0 0118 18.75h-2.25m-7.5-10.5H4.875c-.621 0-1.125.504-1.125 1.125v11.25c0 .621.504 1.125 1.125 1.125h9.75c.621 0 1.125-.504 1.125-1.125V18.75m-7.5-10.5h6.375c.621 0 1.125.504 1.125 1.125v9.375m-8.25-3l1.5 1.5 3-3.75&quot; /&gt;
        &lt;/svg&gt;
    &lt;/button&gt;
&lt;/div&gt;&lt;pre class=&quot;phiki language-shellscript github-light&quot; data-language=&quot;shellscript&quot; style=&quot;background-color: #fff;color: #24292e;&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;token&quot; style=&quot;color: #6f42c1;&quot;&gt;sudo&lt;/span&gt;&lt;span class=&quot;token&quot;&gt; &lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #032f62;&quot;&gt;systemctl&lt;/span&gt;&lt;span class=&quot;token&quot;&gt; &lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #032f62;&quot;&gt;restart&lt;/span&gt;&lt;span class=&quot;token&quot;&gt; &lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #032f62;&quot;&gt;systemd-journald&lt;/span&gt;&lt;span class=&quot;token&quot;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;That's it!&lt;/p&gt;
&lt;p&gt;You just freed several gigabytes and prevented the problem from happening again.&lt;/p&gt;</summary>
        <content type="html">&lt;p&gt;Running a small VPS for your side projects? You might notice your disk filling up mysteriously. Before upgrading your plan or deleting important files, check your systemd journal logs – they're often the silent disk space killer.&lt;/p&gt;
&lt;ul class=&quot;table-of-contents not-prose&quot;&gt;
&lt;li&gt;&lt;a href=&quot;#content-the-problem&quot;&gt;The problem&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;#content-immediate-fix&quot;&gt;Immediate fix&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;#content-permanent-fix--limit-current-log-growth&quot;&gt;Permanent fix – Limit current log growth&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;&lt;a id=&quot;content-the-problem&quot; href=&quot;#content-the-problem&quot; class=&quot;heading-permalink&quot; aria-hidden=&quot;true&quot; tabindex=&quot;-1&quot; title=&quot;Permalink&quot;&gt;#&lt;/a&gt;The problem&lt;/h2&gt;
&lt;p&gt;By default, systemd journal logs everything: every service start, every error, every SSH attempt. On a small VPS, these logs can grow to several gigabytes without you noticing.&lt;/p&gt;
&lt;p&gt;Check your current journal size:&lt;/p&gt;
&lt;div x-data=&quot;codeBlock&quot; class=&quot;code-block relative&quot;&gt;&lt;div class=&quot;flex space-x-2 items-center absolute top-0 right-0&quot;&gt;
    &lt;div x-cloak x-show=&quot;showMessage&quot; x-transition class=&quot;py-2 animate-bounce transition duration-300 mt-1 text-sky-500 text-xs&quot;&gt;Copied!&lt;/div&gt;
    &lt;button
        type=&quot;button&quot;
        title=&quot;Copy to clipboard&quot;
        class=&quot;hidden sm:block p-2 pl-3 transition duration-300&quot;
        @click.prevent=&quot;copyToClipboard&quot;
        :class=&quot;{
            'text-black/30 hover:text-black/80': !showMessage,
            'text-sky-500 hover:text-sky-700': showMessage,
        }&quot;&gt;
        &lt;svg xmlns=&quot;http://www.w3.org/2000/svg&quot; fill=&quot;none&quot; viewBox=&quot;0 0 24 24&quot; stroke-width=&quot;1.5&quot; stroke=&quot;currentColor&quot; class=&quot;block w-6 h-6&quot;&gt;
            &lt;path fill=&quot;white&quot; stroke-linecap=&quot;round&quot; stroke-linejoin=&quot;round&quot; d=&quot;M11.35 3.836c-.065.21-.1.433-.1.664 0 .414.336.75.75.75h4.5a.75.75 0 00.75-.75 2.25 2.25 0 00-.1-.664m-5.8 0A2.251 2.251 0 0113.5 2.25H15c1.012 0 1.867.668 2.15 1.586m-5.8 0c-.376.023-.75.05-1.124.08C9.095 4.01 8.25 4.973 8.25 6.108V8.25m8.9-4.414c.376.023.75.05 1.124.08 1.131.094 1.976 1.057 1.976 2.192V16.5A2.25 2.25 0 0118 18.75h-2.25m-7.5-10.5H4.875c-.621 0-1.125.504-1.125 1.125v11.25c0 .621.504 1.125 1.125 1.125h9.75c.621 0 1.125-.504 1.125-1.125V18.75m-7.5-10.5h6.375c.621 0 1.125.504 1.125 1.125v9.375m-8.25-3l1.5 1.5 3-3.75&quot; /&gt;
        &lt;/svg&gt;
    &lt;/button&gt;
&lt;/div&gt;&lt;pre class=&quot;phiki language-shellscript github-light&quot; data-language=&quot;shellscript&quot; style=&quot;background-color: #fff;color: #24292e;&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;token&quot; style=&quot;color: #6f42c1;&quot;&gt;sudo&lt;/span&gt;&lt;span class=&quot;token&quot;&gt; &lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #032f62;&quot;&gt;journalctl&lt;/span&gt;&lt;span class=&quot;token&quot;&gt; &lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #005cc5;&quot;&gt;-&lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #005cc5;&quot;&gt;-disk-usage&lt;/span&gt;&lt;span class=&quot;token&quot;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;If you see anything over 1GB on a small VPS, you're wasting precious disk space.&lt;/p&gt;
&lt;p&gt;In my case, &lt;code&gt;/var/log/journal&lt;/code&gt; was eating &lt;strong&gt;3.1GB&lt;/strong&gt; on a &lt;strong&gt;25GB VPS&lt;/strong&gt;. That's &lt;strong&gt;12%&lt;/strong&gt; of my total disk space!&lt;/p&gt;
&lt;h2&gt;&lt;a id=&quot;content-immediate-fix&quot; href=&quot;#content-immediate-fix&quot; class=&quot;heading-permalink&quot; aria-hidden=&quot;true&quot; tabindex=&quot;-1&quot; title=&quot;Permalink&quot;&gt;#&lt;/a&gt;Immediate fix&lt;/h2&gt;
&lt;p&gt;Clean up old logs by deleting logs older than a certain time or limiting the total size:&lt;/p&gt;
&lt;div x-data=&quot;codeBlock&quot; class=&quot;code-block relative&quot;&gt;&lt;div class=&quot;flex space-x-2 items-center absolute top-0 right-0&quot;&gt;
    &lt;div x-cloak x-show=&quot;showMessage&quot; x-transition class=&quot;py-2 animate-bounce transition duration-300 mt-1 text-sky-500 text-xs&quot;&gt;Copied!&lt;/div&gt;
    &lt;button
        type=&quot;button&quot;
        title=&quot;Copy to clipboard&quot;
        class=&quot;hidden sm:block p-2 pl-3 transition duration-300&quot;
        @click.prevent=&quot;copyToClipboard&quot;
        :class=&quot;{
            'text-black/30 hover:text-black/80': !showMessage,
            'text-sky-500 hover:text-sky-700': showMessage,
        }&quot;&gt;
        &lt;svg xmlns=&quot;http://www.w3.org/2000/svg&quot; fill=&quot;none&quot; viewBox=&quot;0 0 24 24&quot; stroke-width=&quot;1.5&quot; stroke=&quot;currentColor&quot; class=&quot;block w-6 h-6&quot;&gt;
            &lt;path fill=&quot;white&quot; stroke-linecap=&quot;round&quot; stroke-linejoin=&quot;round&quot; d=&quot;M11.35 3.836c-.065.21-.1.433-.1.664 0 .414.336.75.75.75h4.5a.75.75 0 00.75-.75 2.25 2.25 0 00-.1-.664m-5.8 0A2.251 2.251 0 0113.5 2.25H15c1.012 0 1.867.668 2.15 1.586m-5.8 0c-.376.023-.75.05-1.124.08C9.095 4.01 8.25 4.973 8.25 6.108V8.25m8.9-4.414c.376.023.75.05 1.124.08 1.131.094 1.976 1.057 1.976 2.192V16.5A2.25 2.25 0 0118 18.75h-2.25m-7.5-10.5H4.875c-.621 0-1.125.504-1.125 1.125v11.25c0 .621.504 1.125 1.125 1.125h9.75c.621 0 1.125-.504 1.125-1.125V18.75m-7.5-10.5h6.375c.621 0 1.125.504 1.125 1.125v9.375m-8.25-3l1.5 1.5 3-3.75&quot; /&gt;
        &lt;/svg&gt;
    &lt;/button&gt;
&lt;/div&gt;&lt;pre class=&quot;phiki language-shellscript github-light&quot; data-language=&quot;shellscript&quot; style=&quot;background-color: #fff;color: #24292e;&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;token&quot; style=&quot;color: #6f42c1;&quot;&gt;sudo&lt;/span&gt;&lt;span class=&quot;token&quot;&gt; &lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #032f62;&quot;&gt;journalctl&lt;/span&gt;&lt;span class=&quot;token&quot;&gt; &lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #005cc5;&quot;&gt;-&lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #005cc5;&quot;&gt;-vacuum-time=7d&lt;/span&gt;&lt;span class=&quot;token&quot;&gt; &lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #6a737d;&quot;&gt;#&lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #6a737d;&quot;&gt; keep only last 7 days
&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;token&quot; style=&quot;color: #6f42c1;&quot;&gt;sudo&lt;/span&gt;&lt;span class=&quot;token&quot;&gt; &lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #032f62;&quot;&gt;journalctl&lt;/span&gt;&lt;span class=&quot;token&quot;&gt; &lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #005cc5;&quot;&gt;-&lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #005cc5;&quot;&gt;-vacuum-size=500M&lt;/span&gt;&lt;span class=&quot;token&quot;&gt; &lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #6a737d;&quot;&gt;#&lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #6a737d;&quot;&gt; keep only 500MB of logs
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;h2&gt;&lt;a id=&quot;content-permanent-fix--limit-current-log-growth&quot; href=&quot;#content-permanent-fix--limit-current-log-growth&quot; class=&quot;heading-permalink&quot; aria-hidden=&quot;true&quot; tabindex=&quot;-1&quot; title=&quot;Permalink&quot;&gt;#&lt;/a&gt;Permanent fix – Limit current log growth&lt;/h2&gt;
&lt;p&gt;To prevent this from happening again, you can configure systemd to limit the size and retention of journal logs.&lt;/p&gt;
&lt;p&gt;Edit the journal configuration:&lt;/p&gt;
&lt;div x-data=&quot;codeBlock&quot; class=&quot;code-block relative&quot;&gt;&lt;div class=&quot;flex space-x-2 items-center absolute top-0 right-0&quot;&gt;
    &lt;div x-cloak x-show=&quot;showMessage&quot; x-transition class=&quot;py-2 animate-bounce transition duration-300 mt-1 text-sky-500 text-xs&quot;&gt;Copied!&lt;/div&gt;
    &lt;button
        type=&quot;button&quot;
        title=&quot;Copy to clipboard&quot;
        class=&quot;hidden sm:block p-2 pl-3 transition duration-300&quot;
        @click.prevent=&quot;copyToClipboard&quot;
        :class=&quot;{
            'text-black/30 hover:text-black/80': !showMessage,
            'text-sky-500 hover:text-sky-700': showMessage,
        }&quot;&gt;
        &lt;svg xmlns=&quot;http://www.w3.org/2000/svg&quot; fill=&quot;none&quot; viewBox=&quot;0 0 24 24&quot; stroke-width=&quot;1.5&quot; stroke=&quot;currentColor&quot; class=&quot;block w-6 h-6&quot;&gt;
            &lt;path fill=&quot;white&quot; stroke-linecap=&quot;round&quot; stroke-linejoin=&quot;round&quot; d=&quot;M11.35 3.836c-.065.21-.1.433-.1.664 0 .414.336.75.75.75h4.5a.75.75 0 00.75-.75 2.25 2.25 0 00-.1-.664m-5.8 0A2.251 2.251 0 0113.5 2.25H15c1.012 0 1.867.668 2.15 1.586m-5.8 0c-.376.023-.75.05-1.124.08C9.095 4.01 8.25 4.973 8.25 6.108V8.25m8.9-4.414c.376.023.75.05 1.124.08 1.131.094 1.976 1.057 1.976 2.192V16.5A2.25 2.25 0 0118 18.75h-2.25m-7.5-10.5H4.875c-.621 0-1.125.504-1.125 1.125v11.25c0 .621.504 1.125 1.125 1.125h9.75c.621 0 1.125-.504 1.125-1.125V18.75m-7.5-10.5h6.375c.621 0 1.125.504 1.125 1.125v9.375m-8.25-3l1.5 1.5 3-3.75&quot; /&gt;
        &lt;/svg&gt;
    &lt;/button&gt;
&lt;/div&gt;&lt;pre class=&quot;phiki language-shellscript github-light&quot; data-language=&quot;shellscript&quot; style=&quot;background-color: #fff;color: #24292e;&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;token&quot; style=&quot;color: #6f42c1;&quot;&gt;sudo&lt;/span&gt;&lt;span class=&quot;token&quot;&gt; &lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #032f62;&quot;&gt;nano&lt;/span&gt;&lt;span class=&quot;token&quot;&gt; &lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #032f62;&quot;&gt;/etc/systemd/journald.conf&lt;/span&gt;&lt;span class=&quot;token&quot;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;Uncomment and adjust these values to your preference:&lt;/p&gt;
&lt;div x-data=&quot;codeBlock&quot; class=&quot;code-block relative&quot;&gt;&lt;div class=&quot;flex space-x-2 items-center absolute top-0 right-0&quot;&gt;
    &lt;div x-cloak x-show=&quot;showMessage&quot; x-transition class=&quot;py-2 animate-bounce transition duration-300 mt-1 text-sky-500 text-xs&quot;&gt;Copied!&lt;/div&gt;
    &lt;button
        type=&quot;button&quot;
        title=&quot;Copy to clipboard&quot;
        class=&quot;hidden sm:block p-2 pl-3 transition duration-300&quot;
        @click.prevent=&quot;copyToClipboard&quot;
        :class=&quot;{
            'text-black/30 hover:text-black/80': !showMessage,
            'text-sky-500 hover:text-sky-700': showMessage,
        }&quot;&gt;
        &lt;svg xmlns=&quot;http://www.w3.org/2000/svg&quot; fill=&quot;none&quot; viewBox=&quot;0 0 24 24&quot; stroke-width=&quot;1.5&quot; stroke=&quot;currentColor&quot; class=&quot;block w-6 h-6&quot;&gt;
            &lt;path fill=&quot;white&quot; stroke-linecap=&quot;round&quot; stroke-linejoin=&quot;round&quot; d=&quot;M11.35 3.836c-.065.21-.1.433-.1.664 0 .414.336.75.75.75h4.5a.75.75 0 00.75-.75 2.25 2.25 0 00-.1-.664m-5.8 0A2.251 2.251 0 0113.5 2.25H15c1.012 0 1.867.668 2.15 1.586m-5.8 0c-.376.023-.75.05-1.124.08C9.095 4.01 8.25 4.973 8.25 6.108V8.25m8.9-4.414c.376.023.75.05 1.124.08 1.131.094 1.976 1.057 1.976 2.192V16.5A2.25 2.25 0 0118 18.75h-2.25m-7.5-10.5H4.875c-.621 0-1.125.504-1.125 1.125v11.25c0 .621.504 1.125 1.125 1.125h9.75c.621 0 1.125-.504 1.125-1.125V18.75m-7.5-10.5h6.375c.621 0 1.125.504 1.125 1.125v9.375m-8.25-3l1.5 1.5 3-3.75&quot; /&gt;
        &lt;/svg&gt;
    &lt;/button&gt;
&lt;/div&gt;&lt;pre class=&quot;phiki language-shellscript github-light&quot; data-language=&quot;shellscript&quot; style=&quot;background-color: #fff;color: #24292e;&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;token&quot; style=&quot;color: #24292e;&quot;&gt;SystemMaxUse&lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #d73a49;&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #032f62;&quot;&gt;5&lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #032f62;&quot;&gt;0&lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #032f62;&quot;&gt;0&lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #032f62;&quot;&gt;M&lt;/span&gt;&lt;span class=&quot;token&quot;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;token&quot; style=&quot;color: #24292e;&quot;&gt;SystemKeepFree&lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #d73a49;&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #032f62;&quot;&gt;1&lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #032f62;&quot;&gt;G&lt;/span&gt;&lt;span class=&quot;token&quot;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;token&quot; style=&quot;color: #24292e;&quot;&gt;MaxRetentionSec&lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #d73a49;&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #032f62;&quot;&gt;7&lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #032f62;&quot;&gt;d&lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #032f62;&quot;&gt;a&lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #032f62;&quot;&gt;y&lt;/span&gt;&lt;span class=&quot;token&quot;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;Restart the service:&lt;/p&gt;
&lt;div x-data=&quot;codeBlock&quot; class=&quot;code-block relative&quot;&gt;&lt;div class=&quot;flex space-x-2 items-center absolute top-0 right-0&quot;&gt;
    &lt;div x-cloak x-show=&quot;showMessage&quot; x-transition class=&quot;py-2 animate-bounce transition duration-300 mt-1 text-sky-500 text-xs&quot;&gt;Copied!&lt;/div&gt;
    &lt;button
        type=&quot;button&quot;
        title=&quot;Copy to clipboard&quot;
        class=&quot;hidden sm:block p-2 pl-3 transition duration-300&quot;
        @click.prevent=&quot;copyToClipboard&quot;
        :class=&quot;{
            'text-black/30 hover:text-black/80': !showMessage,
            'text-sky-500 hover:text-sky-700': showMessage,
        }&quot;&gt;
        &lt;svg xmlns=&quot;http://www.w3.org/2000/svg&quot; fill=&quot;none&quot; viewBox=&quot;0 0 24 24&quot; stroke-width=&quot;1.5&quot; stroke=&quot;currentColor&quot; class=&quot;block w-6 h-6&quot;&gt;
            &lt;path fill=&quot;white&quot; stroke-linecap=&quot;round&quot; stroke-linejoin=&quot;round&quot; d=&quot;M11.35 3.836c-.065.21-.1.433-.1.664 0 .414.336.75.75.75h4.5a.75.75 0 00.75-.75 2.25 2.25 0 00-.1-.664m-5.8 0A2.251 2.251 0 0113.5 2.25H15c1.012 0 1.867.668 2.15 1.586m-5.8 0c-.376.023-.75.05-1.124.08C9.095 4.01 8.25 4.973 8.25 6.108V8.25m8.9-4.414c.376.023.75.05 1.124.08 1.131.094 1.976 1.057 1.976 2.192V16.5A2.25 2.25 0 0118 18.75h-2.25m-7.5-10.5H4.875c-.621 0-1.125.504-1.125 1.125v11.25c0 .621.504 1.125 1.125 1.125h9.75c.621 0 1.125-.504 1.125-1.125V18.75m-7.5-10.5h6.375c.621 0 1.125.504 1.125 1.125v9.375m-8.25-3l1.5 1.5 3-3.75&quot; /&gt;
        &lt;/svg&gt;
    &lt;/button&gt;
&lt;/div&gt;&lt;pre class=&quot;phiki language-shellscript github-light&quot; data-language=&quot;shellscript&quot; style=&quot;background-color: #fff;color: #24292e;&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;token&quot; style=&quot;color: #6f42c1;&quot;&gt;sudo&lt;/span&gt;&lt;span class=&quot;token&quot;&gt; &lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #032f62;&quot;&gt;systemctl&lt;/span&gt;&lt;span class=&quot;token&quot;&gt; &lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #032f62;&quot;&gt;restart&lt;/span&gt;&lt;span class=&quot;token&quot;&gt; &lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #032f62;&quot;&gt;systemd-journald&lt;/span&gt;&lt;span class=&quot;token&quot;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;That's it!&lt;/p&gt;
&lt;p&gt;You just freed several gigabytes and prevented the problem from happening again.&lt;/p&gt;</content>
        <author>
            <name>Eser DENIZ</name>
        </author>
    </entry>
    <entry>
        <title type="text">Laravel Nightwatch: Log outgoing requests from Saloon</title>
        <link href="https://srwiez.com/posts/laravel-nightwatch-log-outgoing-requests-from-saloon"/>
        <id>https://srwiez.com/posts/laravel-nightwatch-log-outgoing-requests-from-saloon</id>
        <published>2025-06-17T00:00:00+00:00</published>
        <updated>2025-06-17T15:03:01+00:00</updated>
        <summary type="text">&lt;p&gt;&lt;a href=&quot;https://nightwatch.laravel.com&quot;&gt;Laravel Nightwatch&lt;/a&gt; has been released this morning, and on &lt;a href=&quot;https://unolia.com&quot;&gt;Unolia&lt;/a&gt;, we are using &lt;a href=&quot;https://docs.saloon.dev&quot;&gt;Saloon&lt;/a&gt; to make outgoing HTTP requests to our API. I wanted to log these requests in Nightwatch so I can see them in the dashboard.&lt;/p&gt;
&lt;!-- more --&gt;
&lt;hr /&gt;
&lt;p&gt;&lt;strong&gt;UPDATE 21 June 2025&lt;/strong&gt;: I pushed a PR to Saloon to add support for Laravel Nightwatch, which is available in Saloon &lt;a href=&quot;https://github.com/saloonphp/laravel-plugin/releases/tag/v3.6.0&quot;&gt;v3.6.0&lt;/a&gt; and later. Just use the following command and skip this article:&lt;/p&gt;
&lt;div x-data=&quot;codeBlock&quot; class=&quot;code-block relative&quot;&gt;&lt;div class=&quot;flex space-x-2 items-center absolute top-0 right-0&quot;&gt;
    &lt;div x-cloak x-show=&quot;showMessage&quot; x-transition class=&quot;py-2 animate-bounce transition duration-300 mt-1 text-sky-500 text-xs&quot;&gt;Copied!&lt;/div&gt;
    &lt;button
        type=&quot;button&quot;
        title=&quot;Copy to clipboard&quot;
        class=&quot;hidden sm:block p-2 pl-3 transition duration-300&quot;
        @click.prevent=&quot;copyToClipboard&quot;
        :class=&quot;{
            'text-black/30 hover:text-black/80': !showMessage,
            'text-sky-500 hover:text-sky-700': showMessage,
        }&quot;&gt;
        &lt;svg xmlns=&quot;http://www.w3.org/2000/svg&quot; fill=&quot;none&quot; viewBox=&quot;0 0 24 24&quot; stroke-width=&quot;1.5&quot; stroke=&quot;currentColor&quot; class=&quot;block w-6 h-6&quot;&gt;
            &lt;path fill=&quot;white&quot; stroke-linecap=&quot;round&quot; stroke-linejoin=&quot;round&quot; d=&quot;M11.35 3.836c-.065.21-.1.433-.1.664 0 .414.336.75.75.75h4.5a.75.75 0 00.75-.75 2.25 2.25 0 00-.1-.664m-5.8 0A2.251 2.251 0 0113.5 2.25H15c1.012 0 1.867.668 2.15 1.586m-5.8 0c-.376.023-.75.05-1.124.08C9.095 4.01 8.25 4.973 8.25 6.108V8.25m8.9-4.414c.376.023.75.05 1.124.08 1.131.094 1.976 1.057 1.976 2.192V16.5A2.25 2.25 0 0118 18.75h-2.25m-7.5-10.5H4.875c-.621 0-1.125.504-1.125 1.125v11.25c0 .621.504 1.125 1.125 1.125h9.75c.621 0 1.125-.504 1.125-1.125V18.75m-7.5-10.5h6.375c.621 0 1.125.504 1.125 1.125v9.375m-8.25-3l1.5 1.5 3-3.75&quot; /&gt;
        &lt;/svg&gt;
    &lt;/button&gt;
&lt;/div&gt;&lt;pre class=&quot;phiki language-shellscript github-light&quot; data-language=&quot;shellscript&quot; style=&quot;background-color: #fff;color: #24292e;&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;token&quot; style=&quot;color: #6f42c1;&quot;&gt;composer&lt;/span&gt;&lt;span class=&quot;token&quot;&gt; &lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #032f62;&quot;&gt;require&lt;/span&gt;&lt;span class=&quot;token&quot;&gt; &lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #032f62;&quot;&gt;saloonphp/laravel-plugin&lt;/span&gt;&lt;span class=&quot;token&quot;&gt; &lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #032f62;&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #032f62;&quot;&gt;^3.6.0&lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #032f62;&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span class=&quot;token&quot;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;hr /&gt;
&lt;p&gt;To log outgoing requests from Saloon in Laravel Nightwatch, you'll need to create a custom HTTP sender that integrates Nightwatch's middleware.&lt;/p&gt;
&lt;p&gt;Following the Saloon and Nightwatch documentation, create this new class wherever you need it, for example, in &lt;code&gt;app/Http/HttpSender/LaravelSender.php&lt;/code&gt;:&lt;/p&gt;
&lt;div x-data=&quot;codeBlock&quot; class=&quot;code-block relative&quot;&gt;&lt;div class=&quot;flex space-x-2 items-center absolute top-0 right-0&quot;&gt;
    &lt;div x-cloak x-show=&quot;showMessage&quot; x-transition class=&quot;py-2 animate-bounce transition duration-300 mt-1 text-sky-500 text-xs&quot;&gt;Copied!&lt;/div&gt;
    &lt;button
        type=&quot;button&quot;
        title=&quot;Copy to clipboard&quot;
        class=&quot;hidden sm:block p-2 pl-3 transition duration-300&quot;
        @click.prevent=&quot;copyToClipboard&quot;
        :class=&quot;{
            'text-black/30 hover:text-black/80': !showMessage,
            'text-sky-500 hover:text-sky-700': showMessage,
        }&quot;&gt;
        &lt;svg xmlns=&quot;http://www.w3.org/2000/svg&quot; fill=&quot;none&quot; viewBox=&quot;0 0 24 24&quot; stroke-width=&quot;1.5&quot; stroke=&quot;currentColor&quot; class=&quot;block w-6 h-6&quot;&gt;
            &lt;path fill=&quot;white&quot; stroke-linecap=&quot;round&quot; stroke-linejoin=&quot;round&quot; d=&quot;M11.35 3.836c-.065.21-.1.433-.1.664 0 .414.336.75.75.75h4.5a.75.75 0 00.75-.75 2.25 2.25 0 00-.1-.664m-5.8 0A2.251 2.251 0 0113.5 2.25H15c1.012 0 1.867.668 2.15 1.586m-5.8 0c-.376.023-.75.05-1.124.08C9.095 4.01 8.25 4.973 8.25 6.108V8.25m8.9-4.414c.376.023.75.05 1.124.08 1.131.094 1.976 1.057 1.976 2.192V16.5A2.25 2.25 0 0118 18.75h-2.25m-7.5-10.5H4.875c-.621 0-1.125.504-1.125 1.125v11.25c0 .621.504 1.125 1.125 1.125h9.75c.621 0 1.125-.504 1.125-1.125V18.75m-7.5-10.5h6.375c.621 0 1.125.504 1.125 1.125v9.375m-8.25-3l1.5 1.5 3-3.75&quot; /&gt;
        &lt;/svg&gt;
    &lt;/button&gt;
&lt;/div&gt;&lt;pre class=&quot;phiki language-php github-light&quot; data-language=&quot;php&quot; style=&quot;background-color: #fff;color: #24292e;&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;token&quot; style=&quot;color: #d73a49;&quot;&gt;&amp;lt;&lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #d73a49;&quot;&gt;?&lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #005cc5;&quot;&gt;php&lt;/span&gt;&lt;span class=&quot;token&quot;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;token&quot;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;token&quot; style=&quot;color: #d73a49;&quot;&gt;namespace&lt;/span&gt;&lt;span class=&quot;token&quot;&gt; &lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #6f42c1;&quot;&gt;App&lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #6f42c1;&quot;&gt;\&lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #6f42c1;&quot;&gt;Http&lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #6f42c1;&quot;&gt;\&lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #6f42c1;&quot;&gt;HttpSender&lt;/span&gt;&lt;span class=&quot;token&quot;&gt;;&lt;/span&gt;&lt;span class=&quot;token&quot;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;token&quot;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;token&quot; style=&quot;color: #d73a49;&quot;&gt;use&lt;/span&gt;&lt;span class=&quot;token&quot;&gt; &lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #005cc5;&quot;&gt;Laravel&lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #005cc5;&quot;&gt;\&lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #005cc5;&quot;&gt;Nightwatch&lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #005cc5;&quot;&gt;\&lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #005cc5;&quot;&gt;Facades&lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #005cc5;&quot;&gt;\&lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #005cc5;&quot;&gt;Nightwatch&lt;/span&gt;&lt;span class=&quot;token&quot;&gt;;&lt;/span&gt;&lt;span class=&quot;token&quot;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;token&quot; style=&quot;color: #d73a49;&quot;&gt;use&lt;/span&gt;&lt;span class=&quot;token&quot;&gt; &lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #005cc5;&quot;&gt;Saloon&lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #005cc5;&quot;&gt;\&lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #005cc5;&quot;&gt;HttpSender&lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #005cc5;&quot;&gt;\&lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #005cc5;&quot;&gt;HttpSender&lt;/span&gt;&lt;span class=&quot;token&quot;&gt;;&lt;/span&gt;&lt;span class=&quot;token&quot;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;token&quot;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;token&quot; style=&quot;color: #d73a49;&quot;&gt;class&lt;/span&gt;&lt;span class=&quot;token&quot;&gt; &lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #6f42c1;&quot;&gt;LaravelSender&lt;/span&gt;&lt;span class=&quot;token&quot;&gt; &lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #d73a49;&quot;&gt;extends&lt;/span&gt;&lt;span class=&quot;token&quot;&gt; &lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #6f42c1;&quot;&gt;HttpSender&lt;/span&gt;&lt;span class=&quot;token&quot;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;token&quot;&gt;{&lt;/span&gt;&lt;span class=&quot;token&quot;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;token&quot;&gt;    &lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #d73a49;&quot;&gt;public&lt;/span&gt;&lt;span class=&quot;token&quot;&gt; &lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #d73a49;&quot;&gt;function&lt;/span&gt;&lt;span class=&quot;token&quot;&gt; &lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #005cc5;&quot;&gt;__construct&lt;/span&gt;&lt;span class=&quot;token&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token&quot;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;token&quot;&gt;    &lt;/span&gt;&lt;span class=&quot;token&quot;&gt;{&lt;/span&gt;&lt;span class=&quot;token&quot;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;token&quot;&gt;        &lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #d73a49;&quot;&gt;parent&lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #d73a49;&quot;&gt;::&lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #6f42c1;&quot;&gt;__construct&lt;/span&gt;&lt;span class=&quot;token&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token&quot;&gt;;&lt;/span&gt;&lt;span class=&quot;token&quot;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;token&quot;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;token&quot;&gt;        &lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #005cc5;&quot;&gt;$&lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #005cc5;&quot;&gt;this&lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #d73a49;&quot;&gt;-&amp;gt;&lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #24292e;&quot;&gt;handlerStack&lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #d73a49;&quot;&gt;-&amp;gt;&lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #6f42c1;&quot;&gt;push&lt;/span&gt;&lt;span class=&quot;token&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token&quot;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;token&quot;&gt;            &lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #005cc5;&quot;&gt;Nightwatch&lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #d73a49;&quot;&gt;::&lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #6f42c1;&quot;&gt;guzzleMiddleware&lt;/span&gt;&lt;span class=&quot;token&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token&quot;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;token&quot;&gt;        &lt;/span&gt;&lt;span class=&quot;token&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token&quot;&gt;;&lt;/span&gt;&lt;span class=&quot;token&quot;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;token&quot;&gt;    &lt;/span&gt;&lt;span class=&quot;token&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;token&quot;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;token&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;token&quot;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;And edit your &lt;code&gt;config/saloon.php&lt;/code&gt; config file and change this line:&lt;/p&gt;
&lt;div x-data=&quot;codeBlock&quot; class=&quot;code-block relative&quot;&gt;&lt;div class=&quot;flex space-x-2 items-center absolute top-0 right-0&quot;&gt;
    &lt;div x-cloak x-show=&quot;showMessage&quot; x-transition class=&quot;py-2 animate-bounce transition duration-300 mt-1 text-sky-500 text-xs&quot;&gt;Copied!&lt;/div&gt;
    &lt;button
        type=&quot;button&quot;
        title=&quot;Copy to clipboard&quot;
        class=&quot;hidden sm:block p-2 pl-3 transition duration-300&quot;
        @click.prevent=&quot;copyToClipboard&quot;
        :class=&quot;{
            'text-black/30 hover:text-black/80': !showMessage,
            'text-sky-500 hover:text-sky-700': showMessage,
        }&quot;&gt;
        &lt;svg xmlns=&quot;http://www.w3.org/2000/svg&quot; fill=&quot;none&quot; viewBox=&quot;0 0 24 24&quot; stroke-width=&quot;1.5&quot; stroke=&quot;currentColor&quot; class=&quot;block w-6 h-6&quot;&gt;
            &lt;path fill=&quot;white&quot; stroke-linecap=&quot;round&quot; stroke-linejoin=&quot;round&quot; d=&quot;M11.35 3.836c-.065.21-.1.433-.1.664 0 .414.336.75.75.75h4.5a.75.75 0 00.75-.75 2.25 2.25 0 00-.1-.664m-5.8 0A2.251 2.251 0 0113.5 2.25H15c1.012 0 1.867.668 2.15 1.586m-5.8 0c-.376.023-.75.05-1.124.08C9.095 4.01 8.25 4.973 8.25 6.108V8.25m8.9-4.414c.376.023.75.05 1.124.08 1.131.094 1.976 1.057 1.976 2.192V16.5A2.25 2.25 0 0118 18.75h-2.25m-7.5-10.5H4.875c-.621 0-1.125.504-1.125 1.125v11.25c0 .621.504 1.125 1.125 1.125h9.75c.621 0 1.125-.504 1.125-1.125V18.75m-7.5-10.5h6.375c.621 0 1.125.504 1.125 1.125v9.375m-8.25-3l1.5 1.5 3-3.75&quot; /&gt;
        &lt;/svg&gt;
    &lt;/button&gt;
&lt;/div&gt;&lt;pre class=&quot;phiki language-php github-light&quot; data-language=&quot;php&quot; style=&quot;background-color: #fff;color: #24292e;&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;token&quot; style=&quot;color: #032f62;&quot;&gt;&amp;#039;&lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #032f62;&quot;&gt;default_sender&lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #032f62;&quot;&gt;&amp;#039;&lt;/span&gt;&lt;span class=&quot;token&quot;&gt; &lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #d73a49;&quot;&gt;=&amp;gt;&lt;/span&gt;&lt;span class=&quot;token&quot;&gt; &lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #005cc5;&quot;&gt;\&lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #005cc5;&quot;&gt;App&lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #005cc5;&quot;&gt;\&lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #005cc5;&quot;&gt;Http&lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #005cc5;&quot;&gt;\&lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #005cc5;&quot;&gt;HttpSender&lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #005cc5;&quot;&gt;\&lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #005cc5;&quot;&gt;LaravelSender&lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #d73a49;&quot;&gt;::&lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #d73a49;&quot;&gt;class&lt;/span&gt;&lt;span class=&quot;token&quot;&gt;,&lt;/span&gt;&lt;span class=&quot;token&quot;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;Simple!&lt;/p&gt;
&lt;p&gt;This extends the Laravel Saloon HTTP sender to include the Laravel Nightwatch middleware.&lt;/p&gt;
&lt;p&gt;Now, whenever you make an outgoing request using Saloon, it will be logged in Laravel Nightwatch.&lt;/p&gt;</summary>
        <content type="html">&lt;p&gt;&lt;a href=&quot;https://nightwatch.laravel.com&quot;&gt;Laravel Nightwatch&lt;/a&gt; has been released this morning, and on &lt;a href=&quot;https://unolia.com&quot;&gt;Unolia&lt;/a&gt;, we are using &lt;a href=&quot;https://docs.saloon.dev&quot;&gt;Saloon&lt;/a&gt; to make outgoing HTTP requests to our API. I wanted to log these requests in Nightwatch so I can see them in the dashboard.&lt;/p&gt;
&lt;!-- more --&gt;
&lt;hr /&gt;
&lt;p&gt;&lt;strong&gt;UPDATE 21 June 2025&lt;/strong&gt;: I pushed a PR to Saloon to add support for Laravel Nightwatch, which is available in Saloon &lt;a href=&quot;https://github.com/saloonphp/laravel-plugin/releases/tag/v3.6.0&quot;&gt;v3.6.0&lt;/a&gt; and later. Just use the following command and skip this article:&lt;/p&gt;
&lt;div x-data=&quot;codeBlock&quot; class=&quot;code-block relative&quot;&gt;&lt;div class=&quot;flex space-x-2 items-center absolute top-0 right-0&quot;&gt;
    &lt;div x-cloak x-show=&quot;showMessage&quot; x-transition class=&quot;py-2 animate-bounce transition duration-300 mt-1 text-sky-500 text-xs&quot;&gt;Copied!&lt;/div&gt;
    &lt;button
        type=&quot;button&quot;
        title=&quot;Copy to clipboard&quot;
        class=&quot;hidden sm:block p-2 pl-3 transition duration-300&quot;
        @click.prevent=&quot;copyToClipboard&quot;
        :class=&quot;{
            'text-black/30 hover:text-black/80': !showMessage,
            'text-sky-500 hover:text-sky-700': showMessage,
        }&quot;&gt;
        &lt;svg xmlns=&quot;http://www.w3.org/2000/svg&quot; fill=&quot;none&quot; viewBox=&quot;0 0 24 24&quot; stroke-width=&quot;1.5&quot; stroke=&quot;currentColor&quot; class=&quot;block w-6 h-6&quot;&gt;
            &lt;path fill=&quot;white&quot; stroke-linecap=&quot;round&quot; stroke-linejoin=&quot;round&quot; d=&quot;M11.35 3.836c-.065.21-.1.433-.1.664 0 .414.336.75.75.75h4.5a.75.75 0 00.75-.75 2.25 2.25 0 00-.1-.664m-5.8 0A2.251 2.251 0 0113.5 2.25H15c1.012 0 1.867.668 2.15 1.586m-5.8 0c-.376.023-.75.05-1.124.08C9.095 4.01 8.25 4.973 8.25 6.108V8.25m8.9-4.414c.376.023.75.05 1.124.08 1.131.094 1.976 1.057 1.976 2.192V16.5A2.25 2.25 0 0118 18.75h-2.25m-7.5-10.5H4.875c-.621 0-1.125.504-1.125 1.125v11.25c0 .621.504 1.125 1.125 1.125h9.75c.621 0 1.125-.504 1.125-1.125V18.75m-7.5-10.5h6.375c.621 0 1.125.504 1.125 1.125v9.375m-8.25-3l1.5 1.5 3-3.75&quot; /&gt;
        &lt;/svg&gt;
    &lt;/button&gt;
&lt;/div&gt;&lt;pre class=&quot;phiki language-shellscript github-light&quot; data-language=&quot;shellscript&quot; style=&quot;background-color: #fff;color: #24292e;&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;token&quot; style=&quot;color: #6f42c1;&quot;&gt;composer&lt;/span&gt;&lt;span class=&quot;token&quot;&gt; &lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #032f62;&quot;&gt;require&lt;/span&gt;&lt;span class=&quot;token&quot;&gt; &lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #032f62;&quot;&gt;saloonphp/laravel-plugin&lt;/span&gt;&lt;span class=&quot;token&quot;&gt; &lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #032f62;&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #032f62;&quot;&gt;^3.6.0&lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #032f62;&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span class=&quot;token&quot;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;hr /&gt;
&lt;p&gt;To log outgoing requests from Saloon in Laravel Nightwatch, you'll need to create a custom HTTP sender that integrates Nightwatch's middleware.&lt;/p&gt;
&lt;p&gt;Following the Saloon and Nightwatch documentation, create this new class wherever you need it, for example, in &lt;code&gt;app/Http/HttpSender/LaravelSender.php&lt;/code&gt;:&lt;/p&gt;
&lt;div x-data=&quot;codeBlock&quot; class=&quot;code-block relative&quot;&gt;&lt;div class=&quot;flex space-x-2 items-center absolute top-0 right-0&quot;&gt;
    &lt;div x-cloak x-show=&quot;showMessage&quot; x-transition class=&quot;py-2 animate-bounce transition duration-300 mt-1 text-sky-500 text-xs&quot;&gt;Copied!&lt;/div&gt;
    &lt;button
        type=&quot;button&quot;
        title=&quot;Copy to clipboard&quot;
        class=&quot;hidden sm:block p-2 pl-3 transition duration-300&quot;
        @click.prevent=&quot;copyToClipboard&quot;
        :class=&quot;{
            'text-black/30 hover:text-black/80': !showMessage,
            'text-sky-500 hover:text-sky-700': showMessage,
        }&quot;&gt;
        &lt;svg xmlns=&quot;http://www.w3.org/2000/svg&quot; fill=&quot;none&quot; viewBox=&quot;0 0 24 24&quot; stroke-width=&quot;1.5&quot; stroke=&quot;currentColor&quot; class=&quot;block w-6 h-6&quot;&gt;
            &lt;path fill=&quot;white&quot; stroke-linecap=&quot;round&quot; stroke-linejoin=&quot;round&quot; d=&quot;M11.35 3.836c-.065.21-.1.433-.1.664 0 .414.336.75.75.75h4.5a.75.75 0 00.75-.75 2.25 2.25 0 00-.1-.664m-5.8 0A2.251 2.251 0 0113.5 2.25H15c1.012 0 1.867.668 2.15 1.586m-5.8 0c-.376.023-.75.05-1.124.08C9.095 4.01 8.25 4.973 8.25 6.108V8.25m8.9-4.414c.376.023.75.05 1.124.08 1.131.094 1.976 1.057 1.976 2.192V16.5A2.25 2.25 0 0118 18.75h-2.25m-7.5-10.5H4.875c-.621 0-1.125.504-1.125 1.125v11.25c0 .621.504 1.125 1.125 1.125h9.75c.621 0 1.125-.504 1.125-1.125V18.75m-7.5-10.5h6.375c.621 0 1.125.504 1.125 1.125v9.375m-8.25-3l1.5 1.5 3-3.75&quot; /&gt;
        &lt;/svg&gt;
    &lt;/button&gt;
&lt;/div&gt;&lt;pre class=&quot;phiki language-php github-light&quot; data-language=&quot;php&quot; style=&quot;background-color: #fff;color: #24292e;&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;token&quot; style=&quot;color: #d73a49;&quot;&gt;&amp;lt;&lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #d73a49;&quot;&gt;?&lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #005cc5;&quot;&gt;php&lt;/span&gt;&lt;span class=&quot;token&quot;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;token&quot;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;token&quot; style=&quot;color: #d73a49;&quot;&gt;namespace&lt;/span&gt;&lt;span class=&quot;token&quot;&gt; &lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #6f42c1;&quot;&gt;App&lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #6f42c1;&quot;&gt;\&lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #6f42c1;&quot;&gt;Http&lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #6f42c1;&quot;&gt;\&lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #6f42c1;&quot;&gt;HttpSender&lt;/span&gt;&lt;span class=&quot;token&quot;&gt;;&lt;/span&gt;&lt;span class=&quot;token&quot;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;token&quot;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;token&quot; style=&quot;color: #d73a49;&quot;&gt;use&lt;/span&gt;&lt;span class=&quot;token&quot;&gt; &lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #005cc5;&quot;&gt;Laravel&lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #005cc5;&quot;&gt;\&lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #005cc5;&quot;&gt;Nightwatch&lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #005cc5;&quot;&gt;\&lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #005cc5;&quot;&gt;Facades&lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #005cc5;&quot;&gt;\&lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #005cc5;&quot;&gt;Nightwatch&lt;/span&gt;&lt;span class=&quot;token&quot;&gt;;&lt;/span&gt;&lt;span class=&quot;token&quot;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;token&quot; style=&quot;color: #d73a49;&quot;&gt;use&lt;/span&gt;&lt;span class=&quot;token&quot;&gt; &lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #005cc5;&quot;&gt;Saloon&lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #005cc5;&quot;&gt;\&lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #005cc5;&quot;&gt;HttpSender&lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #005cc5;&quot;&gt;\&lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #005cc5;&quot;&gt;HttpSender&lt;/span&gt;&lt;span class=&quot;token&quot;&gt;;&lt;/span&gt;&lt;span class=&quot;token&quot;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;token&quot;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;token&quot; style=&quot;color: #d73a49;&quot;&gt;class&lt;/span&gt;&lt;span class=&quot;token&quot;&gt; &lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #6f42c1;&quot;&gt;LaravelSender&lt;/span&gt;&lt;span class=&quot;token&quot;&gt; &lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #d73a49;&quot;&gt;extends&lt;/span&gt;&lt;span class=&quot;token&quot;&gt; &lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #6f42c1;&quot;&gt;HttpSender&lt;/span&gt;&lt;span class=&quot;token&quot;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;token&quot;&gt;{&lt;/span&gt;&lt;span class=&quot;token&quot;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;token&quot;&gt;    &lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #d73a49;&quot;&gt;public&lt;/span&gt;&lt;span class=&quot;token&quot;&gt; &lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #d73a49;&quot;&gt;function&lt;/span&gt;&lt;span class=&quot;token&quot;&gt; &lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #005cc5;&quot;&gt;__construct&lt;/span&gt;&lt;span class=&quot;token&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token&quot;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;token&quot;&gt;    &lt;/span&gt;&lt;span class=&quot;token&quot;&gt;{&lt;/span&gt;&lt;span class=&quot;token&quot;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;token&quot;&gt;        &lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #d73a49;&quot;&gt;parent&lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #d73a49;&quot;&gt;::&lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #6f42c1;&quot;&gt;__construct&lt;/span&gt;&lt;span class=&quot;token&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token&quot;&gt;;&lt;/span&gt;&lt;span class=&quot;token&quot;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;token&quot;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;token&quot;&gt;        &lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #005cc5;&quot;&gt;$&lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #005cc5;&quot;&gt;this&lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #d73a49;&quot;&gt;-&amp;gt;&lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #24292e;&quot;&gt;handlerStack&lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #d73a49;&quot;&gt;-&amp;gt;&lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #6f42c1;&quot;&gt;push&lt;/span&gt;&lt;span class=&quot;token&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token&quot;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;token&quot;&gt;            &lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #005cc5;&quot;&gt;Nightwatch&lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #d73a49;&quot;&gt;::&lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #6f42c1;&quot;&gt;guzzleMiddleware&lt;/span&gt;&lt;span class=&quot;token&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token&quot;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;token&quot;&gt;        &lt;/span&gt;&lt;span class=&quot;token&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token&quot;&gt;;&lt;/span&gt;&lt;span class=&quot;token&quot;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;token&quot;&gt;    &lt;/span&gt;&lt;span class=&quot;token&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;token&quot;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;token&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;token&quot;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;And edit your &lt;code&gt;config/saloon.php&lt;/code&gt; config file and change this line:&lt;/p&gt;
&lt;div x-data=&quot;codeBlock&quot; class=&quot;code-block relative&quot;&gt;&lt;div class=&quot;flex space-x-2 items-center absolute top-0 right-0&quot;&gt;
    &lt;div x-cloak x-show=&quot;showMessage&quot; x-transition class=&quot;py-2 animate-bounce transition duration-300 mt-1 text-sky-500 text-xs&quot;&gt;Copied!&lt;/div&gt;
    &lt;button
        type=&quot;button&quot;
        title=&quot;Copy to clipboard&quot;
        class=&quot;hidden sm:block p-2 pl-3 transition duration-300&quot;
        @click.prevent=&quot;copyToClipboard&quot;
        :class=&quot;{
            'text-black/30 hover:text-black/80': !showMessage,
            'text-sky-500 hover:text-sky-700': showMessage,
        }&quot;&gt;
        &lt;svg xmlns=&quot;http://www.w3.org/2000/svg&quot; fill=&quot;none&quot; viewBox=&quot;0 0 24 24&quot; stroke-width=&quot;1.5&quot; stroke=&quot;currentColor&quot; class=&quot;block w-6 h-6&quot;&gt;
            &lt;path fill=&quot;white&quot; stroke-linecap=&quot;round&quot; stroke-linejoin=&quot;round&quot; d=&quot;M11.35 3.836c-.065.21-.1.433-.1.664 0 .414.336.75.75.75h4.5a.75.75 0 00.75-.75 2.25 2.25 0 00-.1-.664m-5.8 0A2.251 2.251 0 0113.5 2.25H15c1.012 0 1.867.668 2.15 1.586m-5.8 0c-.376.023-.75.05-1.124.08C9.095 4.01 8.25 4.973 8.25 6.108V8.25m8.9-4.414c.376.023.75.05 1.124.08 1.131.094 1.976 1.057 1.976 2.192V16.5A2.25 2.25 0 0118 18.75h-2.25m-7.5-10.5H4.875c-.621 0-1.125.504-1.125 1.125v11.25c0 .621.504 1.125 1.125 1.125h9.75c.621 0 1.125-.504 1.125-1.125V18.75m-7.5-10.5h6.375c.621 0 1.125.504 1.125 1.125v9.375m-8.25-3l1.5 1.5 3-3.75&quot; /&gt;
        &lt;/svg&gt;
    &lt;/button&gt;
&lt;/div&gt;&lt;pre class=&quot;phiki language-php github-light&quot; data-language=&quot;php&quot; style=&quot;background-color: #fff;color: #24292e;&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;token&quot; style=&quot;color: #032f62;&quot;&gt;&amp;#039;&lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #032f62;&quot;&gt;default_sender&lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #032f62;&quot;&gt;&amp;#039;&lt;/span&gt;&lt;span class=&quot;token&quot;&gt; &lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #d73a49;&quot;&gt;=&amp;gt;&lt;/span&gt;&lt;span class=&quot;token&quot;&gt; &lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #005cc5;&quot;&gt;\&lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #005cc5;&quot;&gt;App&lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #005cc5;&quot;&gt;\&lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #005cc5;&quot;&gt;Http&lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #005cc5;&quot;&gt;\&lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #005cc5;&quot;&gt;HttpSender&lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #005cc5;&quot;&gt;\&lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #005cc5;&quot;&gt;LaravelSender&lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #d73a49;&quot;&gt;::&lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #d73a49;&quot;&gt;class&lt;/span&gt;&lt;span class=&quot;token&quot;&gt;,&lt;/span&gt;&lt;span class=&quot;token&quot;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;Simple!&lt;/p&gt;
&lt;p&gt;This extends the Laravel Saloon HTTP sender to include the Laravel Nightwatch middleware.&lt;/p&gt;
&lt;p&gt;Now, whenever you make an outgoing request using Saloon, it will be logged in Laravel Nightwatch.&lt;/p&gt;</content>
        <author>
            <name>Eser DENIZ</name>
        </author>
    </entry>
    <entry>
        <title type="text">Get the last login date of a user in Laravel</title>
        <link href="https://srwiez.com/posts/get-the-last-login-date-of-a-user-in-laravel"/>
        <id>https://srwiez.com/posts/get-the-last-login-date-of-a-user-in-laravel</id>
        <published>2025-06-13T00:00:00+00:00</published>
        <updated>2025-06-13T09:59:14+00:00</updated>
        <summary type="text">&lt;p&gt;By default, in Laravel, the &lt;code&gt;last_login_at&lt;/code&gt; field is not available in the &lt;code&gt;users&lt;/code&gt; table. I personally needed this information to run some background tasks.&lt;/p&gt;
&lt;!-- more --&gt;
&lt;p&gt;The approach I chose is to use the &lt;code&gt;Login&lt;/code&gt; event provided by Laravel Fortify.&lt;/p&gt;
&lt;p&gt;For that, just create a new listener that will update the &lt;code&gt;last_logged_at&lt;/code&gt; field in the &lt;code&gt;users&lt;/code&gt; table whenever a user logs in.&lt;/p&gt;
&lt;ul class=&quot;table-of-contents not-prose&quot;&gt;
&lt;li&gt;&lt;a href=&quot;#content-the-code&quot;&gt;The code&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;#content-some-notes&quot;&gt;Some notes&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;&lt;a id=&quot;content-the-code&quot; href=&quot;#content-the-code&quot; class=&quot;heading-permalink&quot; aria-hidden=&quot;true&quot; tabindex=&quot;-1&quot; title=&quot;Permalink&quot;&gt;#&lt;/a&gt;The code&lt;/h2&gt;
&lt;p&gt;You can create a listener using the Artisan command:&lt;/p&gt;
&lt;div x-data=&quot;codeBlock&quot; class=&quot;code-block relative&quot;&gt;&lt;div class=&quot;flex space-x-2 items-center absolute top-0 right-0&quot;&gt;
    &lt;div x-cloak x-show=&quot;showMessage&quot; x-transition class=&quot;py-2 animate-bounce transition duration-300 mt-1 text-sky-500 text-xs&quot;&gt;Copied!&lt;/div&gt;
    &lt;button
        type=&quot;button&quot;
        title=&quot;Copy to clipboard&quot;
        class=&quot;hidden sm:block p-2 pl-3 transition duration-300&quot;
        @click.prevent=&quot;copyToClipboard&quot;
        :class=&quot;{
            'text-black/30 hover:text-black/80': !showMessage,
            'text-sky-500 hover:text-sky-700': showMessage,
        }&quot;&gt;
        &lt;svg xmlns=&quot;http://www.w3.org/2000/svg&quot; fill=&quot;none&quot; viewBox=&quot;0 0 24 24&quot; stroke-width=&quot;1.5&quot; stroke=&quot;currentColor&quot; class=&quot;block w-6 h-6&quot;&gt;
            &lt;path fill=&quot;white&quot; stroke-linecap=&quot;round&quot; stroke-linejoin=&quot;round&quot; d=&quot;M11.35 3.836c-.065.21-.1.433-.1.664 0 .414.336.75.75.75h4.5a.75.75 0 00.75-.75 2.25 2.25 0 00-.1-.664m-5.8 0A2.251 2.251 0 0113.5 2.25H15c1.012 0 1.867.668 2.15 1.586m-5.8 0c-.376.023-.75.05-1.124.08C9.095 4.01 8.25 4.973 8.25 6.108V8.25m8.9-4.414c.376.023.75.05 1.124.08 1.131.094 1.976 1.057 1.976 2.192V16.5A2.25 2.25 0 0118 18.75h-2.25m-7.5-10.5H4.875c-.621 0-1.125.504-1.125 1.125v11.25c0 .621.504 1.125 1.125 1.125h9.75c.621 0 1.125-.504 1.125-1.125V18.75m-7.5-10.5h6.375c.621 0 1.125.504 1.125 1.125v9.375m-8.25-3l1.5 1.5 3-3.75&quot; /&gt;
        &lt;/svg&gt;
    &lt;/button&gt;
&lt;/div&gt;&lt;pre class=&quot;phiki language-shellscript github-light&quot; data-language=&quot;shellscript&quot; style=&quot;background-color: #fff;color: #24292e;&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;token&quot; style=&quot;color: #6f42c1;&quot;&gt;php&lt;/span&gt;&lt;span class=&quot;token&quot;&gt; &lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #032f62;&quot;&gt;artisan&lt;/span&gt;&lt;span class=&quot;token&quot;&gt; &lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #032f62;&quot;&gt;make:listener&lt;/span&gt;&lt;span class=&quot;token&quot;&gt; &lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #032f62;&quot;&gt;UpdateUserLastLoggedAt&lt;/span&gt;&lt;span class=&quot;token&quot;&gt; &lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #005cc5;&quot;&gt;-&lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #005cc5;&quot;&gt;-event=Illuminate&lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #005cc5;&quot;&gt;\A&lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #005cc5;&quot;&gt;uth&lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #005cc5;&quot;&gt;\E&lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #005cc5;&quot;&gt;vents&lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #005cc5;&quot;&gt;\L&lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #005cc5;&quot;&gt;ogin&lt;/span&gt;&lt;span class=&quot;token&quot;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;And then implement the listener as follows:&lt;/p&gt;
&lt;div x-data=&quot;codeBlock&quot; class=&quot;code-block relative&quot;&gt;&lt;div class=&quot;flex space-x-2 items-center absolute top-0 right-0&quot;&gt;
    &lt;div x-cloak x-show=&quot;showMessage&quot; x-transition class=&quot;py-2 animate-bounce transition duration-300 mt-1 text-sky-500 text-xs&quot;&gt;Copied!&lt;/div&gt;
    &lt;button
        type=&quot;button&quot;
        title=&quot;Copy to clipboard&quot;
        class=&quot;hidden sm:block p-2 pl-3 transition duration-300&quot;
        @click.prevent=&quot;copyToClipboard&quot;
        :class=&quot;{
            'text-black/30 hover:text-black/80': !showMessage,
            'text-sky-500 hover:text-sky-700': showMessage,
        }&quot;&gt;
        &lt;svg xmlns=&quot;http://www.w3.org/2000/svg&quot; fill=&quot;none&quot; viewBox=&quot;0 0 24 24&quot; stroke-width=&quot;1.5&quot; stroke=&quot;currentColor&quot; class=&quot;block w-6 h-6&quot;&gt;
            &lt;path fill=&quot;white&quot; stroke-linecap=&quot;round&quot; stroke-linejoin=&quot;round&quot; d=&quot;M11.35 3.836c-.065.21-.1.433-.1.664 0 .414.336.75.75.75h4.5a.75.75 0 00.75-.75 2.25 2.25 0 00-.1-.664m-5.8 0A2.251 2.251 0 0113.5 2.25H15c1.012 0 1.867.668 2.15 1.586m-5.8 0c-.376.023-.75.05-1.124.08C9.095 4.01 8.25 4.973 8.25 6.108V8.25m8.9-4.414c.376.023.75.05 1.124.08 1.131.094 1.976 1.057 1.976 2.192V16.5A2.25 2.25 0 0118 18.75h-2.25m-7.5-10.5H4.875c-.621 0-1.125.504-1.125 1.125v11.25c0 .621.504 1.125 1.125 1.125h9.75c.621 0 1.125-.504 1.125-1.125V18.75m-7.5-10.5h6.375c.621 0 1.125.504 1.125 1.125v9.375m-8.25-3l1.5 1.5 3-3.75&quot; /&gt;
        &lt;/svg&gt;
    &lt;/button&gt;
&lt;/div&gt;&lt;pre class=&quot;phiki language-php github-light&quot; data-language=&quot;php&quot; style=&quot;background-color: #fff;color: #24292e;&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;token&quot; style=&quot;color: #d73a49;&quot;&gt;&amp;lt;&lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #d73a49;&quot;&gt;?&lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #005cc5;&quot;&gt;php&lt;/span&gt;&lt;span class=&quot;token&quot;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;token&quot;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;token&quot; style=&quot;color: #d73a49;&quot;&gt;namespace&lt;/span&gt;&lt;span class=&quot;token&quot;&gt; &lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #6f42c1;&quot;&gt;App&lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #6f42c1;&quot;&gt;\&lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #6f42c1;&quot;&gt;Listeners&lt;/span&gt;&lt;span class=&quot;token&quot;&gt;;&lt;/span&gt;&lt;span class=&quot;token&quot;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;token&quot;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;token&quot; style=&quot;color: #d73a49;&quot;&gt;use&lt;/span&gt;&lt;span class=&quot;token&quot;&gt; &lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #005cc5;&quot;&gt;App&lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #005cc5;&quot;&gt;\&lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #005cc5;&quot;&gt;Models&lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #005cc5;&quot;&gt;\&lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #005cc5;&quot;&gt;User&lt;/span&gt;&lt;span class=&quot;token&quot;&gt;;&lt;/span&gt;&lt;span class=&quot;token&quot;&gt; 
&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;token&quot; style=&quot;color: #d73a49;&quot;&gt;use&lt;/span&gt;&lt;span class=&quot;token&quot;&gt; &lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #005cc5;&quot;&gt;Illuminate&lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #005cc5;&quot;&gt;\&lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #005cc5;&quot;&gt;Auth&lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #005cc5;&quot;&gt;\&lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #005cc5;&quot;&gt;Events&lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #005cc5;&quot;&gt;\&lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #005cc5;&quot;&gt;Login&lt;/span&gt;&lt;span class=&quot;token&quot;&gt;;&lt;/span&gt;&lt;span class=&quot;token&quot;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;token&quot; style=&quot;color: #d73a49;&quot;&gt;use&lt;/span&gt;&lt;span class=&quot;token&quot;&gt; &lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #005cc5;&quot;&gt;Illuminate&lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #005cc5;&quot;&gt;\&lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #005cc5;&quot;&gt;Contracts&lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #005cc5;&quot;&gt;\&lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #005cc5;&quot;&gt;Queue&lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #005cc5;&quot;&gt;\&lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #005cc5;&quot;&gt;ShouldQueue&lt;/span&gt;&lt;span class=&quot;token&quot;&gt;;&lt;/span&gt;&lt;span class=&quot;token&quot;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;token&quot; style=&quot;color: #d73a49;&quot;&gt;use&lt;/span&gt;&lt;span class=&quot;token&quot;&gt; &lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #005cc5;&quot;&gt;Illuminate&lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #005cc5;&quot;&gt;\&lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #005cc5;&quot;&gt;Queue&lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #005cc5;&quot;&gt;\&lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #005cc5;&quot;&gt;InteractsWithQueue&lt;/span&gt;&lt;span class=&quot;token&quot;&gt;;&lt;/span&gt;&lt;span class=&quot;token&quot;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;token&quot;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;token&quot; style=&quot;color: #d73a49;&quot;&gt;class&lt;/span&gt;&lt;span class=&quot;token&quot;&gt; &lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #6f42c1;&quot;&gt;UpdateUserLastLoggedAt&lt;/span&gt;&lt;span class=&quot;token&quot;&gt; &lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #d73a49;&quot;&gt;implements&lt;/span&gt;&lt;span class=&quot;token&quot;&gt; &lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #6f42c1;&quot;&gt;ShouldQueue&lt;/span&gt;&lt;span class=&quot;token&quot;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;token&quot;&gt;{&lt;/span&gt;&lt;span class=&quot;token&quot;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;token&quot;&gt;    &lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #d73a49;&quot;&gt;use&lt;/span&gt;&lt;span class=&quot;token&quot;&gt; &lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #005cc5;&quot;&gt;InteractsWithQueue&lt;/span&gt;&lt;span class=&quot;token&quot;&gt;;&lt;/span&gt;&lt;span class=&quot;token&quot;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;token&quot;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;token&quot;&gt;    &lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #d73a49;&quot;&gt;public&lt;/span&gt;&lt;span class=&quot;token&quot;&gt; &lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #d73a49;&quot;&gt;function&lt;/span&gt;&lt;span class=&quot;token&quot;&gt; &lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #005cc5;&quot;&gt;__construct&lt;/span&gt;&lt;span class=&quot;token&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token&quot;&gt; &lt;/span&gt;&lt;span class=&quot;token&quot;&gt;{&lt;/span&gt;&lt;span class=&quot;token&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;token&quot;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;token&quot;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;token&quot;&gt;    &lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #d73a49;&quot;&gt;public&lt;/span&gt;&lt;span class=&quot;token&quot;&gt; &lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #d73a49;&quot;&gt;function&lt;/span&gt;&lt;span class=&quot;token&quot;&gt; &lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #6f42c1;&quot;&gt;handle&lt;/span&gt;&lt;span class=&quot;token&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #005cc5;&quot;&gt;Login&lt;/span&gt;&lt;span class=&quot;token&quot;&gt; &lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #24292e;&quot;&gt;$&lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #24292e;&quot;&gt;event&lt;/span&gt;&lt;span class=&quot;token&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #d73a49;&quot;&gt;:&lt;/span&gt;&lt;span class=&quot;token&quot;&gt; &lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #d73a49;&quot;&gt;void&lt;/span&gt;&lt;span class=&quot;token&quot;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;token&quot;&gt;    &lt;/span&gt;&lt;span class=&quot;token&quot;&gt;{&lt;/span&gt;&lt;span class=&quot;token&quot;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;token&quot;&gt;        &lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #6a737d;&quot;&gt;/**&lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #6a737d;&quot;&gt; &lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #d73a49;&quot;&gt;@var&lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #6a737d;&quot;&gt; &lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #005cc5;&quot;&gt;User&lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #6a737d;&quot;&gt; $user &lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #6a737d;&quot;&gt;*/&lt;/span&gt;&lt;span class=&quot;token&quot;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;token&quot;&gt;        &lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #24292e;&quot;&gt;$&lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #24292e;&quot;&gt;user&lt;/span&gt;&lt;span class=&quot;token&quot;&gt; &lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #d73a49;&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;token&quot;&gt; &lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #24292e;&quot;&gt;$&lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #24292e;&quot;&gt;event&lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #d73a49;&quot;&gt;-&amp;gt;&lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #24292e;&quot;&gt;user&lt;/span&gt;&lt;span class=&quot;token&quot;&gt;;&lt;/span&gt;&lt;span class=&quot;token&quot;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;token&quot;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;token&quot;&gt;        &lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #24292e;&quot;&gt;$&lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #24292e;&quot;&gt;user&lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #d73a49;&quot;&gt;-&amp;gt;&lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #6f42c1;&quot;&gt;update&lt;/span&gt;&lt;span class=&quot;token&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;token&quot;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;token&quot;&gt;            &lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #032f62;&quot;&gt;&amp;#039;&lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #032f62;&quot;&gt;last_logged_at&lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #032f62;&quot;&gt;&amp;#039;&lt;/span&gt;&lt;span class=&quot;token&quot;&gt; &lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #d73a49;&quot;&gt;=&amp;gt;&lt;/span&gt;&lt;span class=&quot;token&quot;&gt; &lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #6f42c1;&quot;&gt;now&lt;/span&gt;&lt;span class=&quot;token&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token&quot;&gt;,&lt;/span&gt;&lt;span class=&quot;token&quot;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;token&quot;&gt;        &lt;/span&gt;&lt;span class=&quot;token&quot;&gt;]&lt;/span&gt;&lt;span class=&quot;token&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token&quot;&gt;;&lt;/span&gt;&lt;span class=&quot;token&quot;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;token&quot;&gt;    &lt;/span&gt;&lt;span class=&quot;token&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;token&quot;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;token&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;token&quot;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;blockquote&gt;
&lt;p&gt;By default, Laravel will automatically find and register your event listeners by scanning your application's Listeners directory. When Laravel finds any listener class method that begins with handle or __invoke, Laravel will register those methods as event listeners for the event that is type-hinted in the method's signature.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;— &lt;a href=&quot;https://laravel.com/docs/12.x/events#defining-listeners&quot;&gt;https://laravel.com/docs/12.x/events#defining-listeners&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;Oh and don't forget to add the &lt;code&gt;last_logged_at&lt;/code&gt; field to your &lt;code&gt;users&lt;/code&gt; table migration:&lt;/p&gt;
&lt;div x-data=&quot;codeBlock&quot; class=&quot;code-block relative&quot;&gt;&lt;div class=&quot;flex space-x-2 items-center absolute top-0 right-0&quot;&gt;
    &lt;div x-cloak x-show=&quot;showMessage&quot; x-transition class=&quot;py-2 animate-bounce transition duration-300 mt-1 text-sky-500 text-xs&quot;&gt;Copied!&lt;/div&gt;
    &lt;button
        type=&quot;button&quot;
        title=&quot;Copy to clipboard&quot;
        class=&quot;hidden sm:block p-2 pl-3 transition duration-300&quot;
        @click.prevent=&quot;copyToClipboard&quot;
        :class=&quot;{
            'text-black/30 hover:text-black/80': !showMessage,
            'text-sky-500 hover:text-sky-700': showMessage,
        }&quot;&gt;
        &lt;svg xmlns=&quot;http://www.w3.org/2000/svg&quot; fill=&quot;none&quot; viewBox=&quot;0 0 24 24&quot; stroke-width=&quot;1.5&quot; stroke=&quot;currentColor&quot; class=&quot;block w-6 h-6&quot;&gt;
            &lt;path fill=&quot;white&quot; stroke-linecap=&quot;round&quot; stroke-linejoin=&quot;round&quot; d=&quot;M11.35 3.836c-.065.21-.1.433-.1.664 0 .414.336.75.75.75h4.5a.75.75 0 00.75-.75 2.25 2.25 0 00-.1-.664m-5.8 0A2.251 2.251 0 0113.5 2.25H15c1.012 0 1.867.668 2.15 1.586m-5.8 0c-.376.023-.75.05-1.124.08C9.095 4.01 8.25 4.973 8.25 6.108V8.25m8.9-4.414c.376.023.75.05 1.124.08 1.131.094 1.976 1.057 1.976 2.192V16.5A2.25 2.25 0 0118 18.75h-2.25m-7.5-10.5H4.875c-.621 0-1.125.504-1.125 1.125v11.25c0 .621.504 1.125 1.125 1.125h9.75c.621 0 1.125-.504 1.125-1.125V18.75m-7.5-10.5h6.375c.621 0 1.125.504 1.125 1.125v9.375m-8.25-3l1.5 1.5 3-3.75&quot; /&gt;
        &lt;/svg&gt;
    &lt;/button&gt;
&lt;/div&gt;&lt;pre class=&quot;phiki language-shellscript github-light&quot; data-language=&quot;shellscript&quot; style=&quot;background-color: #fff;color: #24292e;&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;token&quot; style=&quot;color: #6f42c1;&quot;&gt;php&lt;/span&gt;&lt;span class=&quot;token&quot;&gt; &lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #032f62;&quot;&gt;artisan&lt;/span&gt;&lt;span class=&quot;token&quot;&gt; &lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #032f62;&quot;&gt;make:migration&lt;/span&gt;&lt;span class=&quot;token&quot;&gt; &lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #032f62;&quot;&gt;add_last_logged_at_to_users_table&lt;/span&gt;&lt;span class=&quot;token&quot;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;Then, in the migration file, you can add the new column:&lt;/p&gt;
&lt;div x-data=&quot;codeBlock&quot; class=&quot;code-block relative&quot;&gt;&lt;div class=&quot;flex space-x-2 items-center absolute top-0 right-0&quot;&gt;
    &lt;div x-cloak x-show=&quot;showMessage&quot; x-transition class=&quot;py-2 animate-bounce transition duration-300 mt-1 text-sky-500 text-xs&quot;&gt;Copied!&lt;/div&gt;
    &lt;button
        type=&quot;button&quot;
        title=&quot;Copy to clipboard&quot;
        class=&quot;hidden sm:block p-2 pl-3 transition duration-300&quot;
        @click.prevent=&quot;copyToClipboard&quot;
        :class=&quot;{
            'text-black/30 hover:text-black/80': !showMessage,
            'text-sky-500 hover:text-sky-700': showMessage,
        }&quot;&gt;
        &lt;svg xmlns=&quot;http://www.w3.org/2000/svg&quot; fill=&quot;none&quot; viewBox=&quot;0 0 24 24&quot; stroke-width=&quot;1.5&quot; stroke=&quot;currentColor&quot; class=&quot;block w-6 h-6&quot;&gt;
            &lt;path fill=&quot;white&quot; stroke-linecap=&quot;round&quot; stroke-linejoin=&quot;round&quot; d=&quot;M11.35 3.836c-.065.21-.1.433-.1.664 0 .414.336.75.75.75h4.5a.75.75 0 00.75-.75 2.25 2.25 0 00-.1-.664m-5.8 0A2.251 2.251 0 0113.5 2.25H15c1.012 0 1.867.668 2.15 1.586m-5.8 0c-.376.023-.75.05-1.124.08C9.095 4.01 8.25 4.973 8.25 6.108V8.25m8.9-4.414c.376.023.75.05 1.124.08 1.131.094 1.976 1.057 1.976 2.192V16.5A2.25 2.25 0 0118 18.75h-2.25m-7.5-10.5H4.875c-.621 0-1.125.504-1.125 1.125v11.25c0 .621.504 1.125 1.125 1.125h9.75c.621 0 1.125-.504 1.125-1.125V18.75m-7.5-10.5h6.375c.621 0 1.125.504 1.125 1.125v9.375m-8.25-3l1.5 1.5 3-3.75&quot; /&gt;
        &lt;/svg&gt;
    &lt;/button&gt;
&lt;/div&gt;&lt;pre class=&quot;phiki language-php github-light&quot; data-language=&quot;php&quot; style=&quot;background-color: #fff;color: #24292e;&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;token&quot; style=&quot;color: #005cc5;&quot;&gt;Schema&lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #d73a49;&quot;&gt;::&lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #6f42c1;&quot;&gt;table&lt;/span&gt;&lt;span class=&quot;token&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #032f62;&quot;&gt;&amp;#039;&lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #032f62;&quot;&gt;users&lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #032f62;&quot;&gt;&amp;#039;&lt;/span&gt;&lt;span class=&quot;token&quot;&gt;,&lt;/span&gt;&lt;span class=&quot;token&quot;&gt; &lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #d73a49;&quot;&gt;function&lt;/span&gt;&lt;span class=&quot;token&quot;&gt; &lt;/span&gt;&lt;span class=&quot;token&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #005cc5;&quot;&gt;Blueprint&lt;/span&gt;&lt;span class=&quot;token&quot;&gt; &lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #24292e;&quot;&gt;$&lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #24292e;&quot;&gt;table&lt;/span&gt;&lt;span class=&quot;token&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token&quot;&gt; &lt;/span&gt;&lt;span class=&quot;token&quot;&gt;{&lt;/span&gt;&lt;span class=&quot;token&quot;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;token&quot;&gt;    &lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #24292e;&quot;&gt;$&lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #24292e;&quot;&gt;table&lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #d73a49;&quot;&gt;-&amp;gt;&lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #6f42c1;&quot;&gt;timestamp&lt;/span&gt;&lt;span class=&quot;token&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #032f62;&quot;&gt;&amp;#039;&lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #032f62;&quot;&gt;last_logged_at&lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #032f62;&quot;&gt;&amp;#039;&lt;/span&gt;&lt;span class=&quot;token&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #d73a49;&quot;&gt;-&amp;gt;&lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #6f42c1;&quot;&gt;nullable&lt;/span&gt;&lt;span class=&quot;token&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token&quot;&gt;;&lt;/span&gt;&lt;span class=&quot;token&quot;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;token&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;token&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token&quot;&gt;;&lt;/span&gt;&lt;span class=&quot;token&quot;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;And run the migration:&lt;/p&gt;
&lt;div x-data=&quot;codeBlock&quot; class=&quot;code-block relative&quot;&gt;&lt;div class=&quot;flex space-x-2 items-center absolute top-0 right-0&quot;&gt;
    &lt;div x-cloak x-show=&quot;showMessage&quot; x-transition class=&quot;py-2 animate-bounce transition duration-300 mt-1 text-sky-500 text-xs&quot;&gt;Copied!&lt;/div&gt;
    &lt;button
        type=&quot;button&quot;
        title=&quot;Copy to clipboard&quot;
        class=&quot;hidden sm:block p-2 pl-3 transition duration-300&quot;
        @click.prevent=&quot;copyToClipboard&quot;
        :class=&quot;{
            'text-black/30 hover:text-black/80': !showMessage,
            'text-sky-500 hover:text-sky-700': showMessage,
        }&quot;&gt;
        &lt;svg xmlns=&quot;http://www.w3.org/2000/svg&quot; fill=&quot;none&quot; viewBox=&quot;0 0 24 24&quot; stroke-width=&quot;1.5&quot; stroke=&quot;currentColor&quot; class=&quot;block w-6 h-6&quot;&gt;
            &lt;path fill=&quot;white&quot; stroke-linecap=&quot;round&quot; stroke-linejoin=&quot;round&quot; d=&quot;M11.35 3.836c-.065.21-.1.433-.1.664 0 .414.336.75.75.75h4.5a.75.75 0 00.75-.75 2.25 2.25 0 00-.1-.664m-5.8 0A2.251 2.251 0 0113.5 2.25H15c1.012 0 1.867.668 2.15 1.586m-5.8 0c-.376.023-.75.05-1.124.08C9.095 4.01 8.25 4.973 8.25 6.108V8.25m8.9-4.414c.376.023.75.05 1.124.08 1.131.094 1.976 1.057 1.976 2.192V16.5A2.25 2.25 0 0118 18.75h-2.25m-7.5-10.5H4.875c-.621 0-1.125.504-1.125 1.125v11.25c0 .621.504 1.125 1.125 1.125h9.75c.621 0 1.125-.504 1.125-1.125V18.75m-7.5-10.5h6.375c.621 0 1.125.504 1.125 1.125v9.375m-8.25-3l1.5 1.5 3-3.75&quot; /&gt;
        &lt;/svg&gt;
    &lt;/button&gt;
&lt;/div&gt;&lt;pre class=&quot;phiki language-shellscript github-light&quot; data-language=&quot;shellscript&quot; style=&quot;background-color: #fff;color: #24292e;&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;token&quot; style=&quot;color: #6f42c1;&quot;&gt;php&lt;/span&gt;&lt;span class=&quot;token&quot;&gt; &lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #032f62;&quot;&gt;artisan&lt;/span&gt;&lt;span class=&quot;token&quot;&gt; &lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #032f62;&quot;&gt;migrate&lt;/span&gt;&lt;span class=&quot;token&quot;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;h2&gt;&lt;a id=&quot;content-some-notes&quot; href=&quot;#content-some-notes&quot; class=&quot;heading-permalink&quot; aria-hidden=&quot;true&quot; tabindex=&quot;-1&quot; title=&quot;Permalink&quot;&gt;#&lt;/a&gt;Some notes&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;The &lt;code&gt;last_logged_at&lt;/code&gt; field is nullable, so it will be &lt;code&gt;null&lt;/code&gt; for users who have never logged in.&lt;/li&gt;
&lt;li&gt;The &lt;code&gt;UpdateUserLastLoggedAt&lt;/code&gt; listener implements the &lt;code&gt;ShouldQueue&lt;/code&gt; interface, which means it will be queued for processing. This is preferable if you want to avoid slowing down the login process.&lt;/li&gt;
&lt;li&gt;This works with Breeze, Jetstream, and Sanctum as they all use the &lt;code&gt;Illuminate\Auth\Events\Login&lt;/code&gt; event.&lt;/li&gt;
&lt;li&gt;If you wanna go further, the &lt;code&gt;Login&lt;/code&gt; event also provides the following properties:
&lt;ul&gt;
&lt;li&gt;string &lt;strong&gt;$guard&lt;/strong&gt; – The authentication guard name.&lt;/li&gt;
&lt;li&gt;Authenticatable &lt;strong&gt;$user&lt;/strong&gt; – The authenticated user.&lt;/li&gt;
&lt;li&gt;bool &lt;strong&gt;$remember&lt;/strong&gt; – Indicates if the user should be &amp;quot;remembered&amp;quot;.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;</summary>
        <content type="html">&lt;p&gt;By default, in Laravel, the &lt;code&gt;last_login_at&lt;/code&gt; field is not available in the &lt;code&gt;users&lt;/code&gt; table. I personally needed this information to run some background tasks.&lt;/p&gt;
&lt;!-- more --&gt;
&lt;p&gt;The approach I chose is to use the &lt;code&gt;Login&lt;/code&gt; event provided by Laravel Fortify.&lt;/p&gt;
&lt;p&gt;For that, just create a new listener that will update the &lt;code&gt;last_logged_at&lt;/code&gt; field in the &lt;code&gt;users&lt;/code&gt; table whenever a user logs in.&lt;/p&gt;
&lt;ul class=&quot;table-of-contents not-prose&quot;&gt;
&lt;li&gt;&lt;a href=&quot;#content-the-code&quot;&gt;The code&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;#content-some-notes&quot;&gt;Some notes&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;&lt;a id=&quot;content-the-code&quot; href=&quot;#content-the-code&quot; class=&quot;heading-permalink&quot; aria-hidden=&quot;true&quot; tabindex=&quot;-1&quot; title=&quot;Permalink&quot;&gt;#&lt;/a&gt;The code&lt;/h2&gt;
&lt;p&gt;You can create a listener using the Artisan command:&lt;/p&gt;
&lt;div x-data=&quot;codeBlock&quot; class=&quot;code-block relative&quot;&gt;&lt;div class=&quot;flex space-x-2 items-center absolute top-0 right-0&quot;&gt;
    &lt;div x-cloak x-show=&quot;showMessage&quot; x-transition class=&quot;py-2 animate-bounce transition duration-300 mt-1 text-sky-500 text-xs&quot;&gt;Copied!&lt;/div&gt;
    &lt;button
        type=&quot;button&quot;
        title=&quot;Copy to clipboard&quot;
        class=&quot;hidden sm:block p-2 pl-3 transition duration-300&quot;
        @click.prevent=&quot;copyToClipboard&quot;
        :class=&quot;{
            'text-black/30 hover:text-black/80': !showMessage,
            'text-sky-500 hover:text-sky-700': showMessage,
        }&quot;&gt;
        &lt;svg xmlns=&quot;http://www.w3.org/2000/svg&quot; fill=&quot;none&quot; viewBox=&quot;0 0 24 24&quot; stroke-width=&quot;1.5&quot; stroke=&quot;currentColor&quot; class=&quot;block w-6 h-6&quot;&gt;
            &lt;path fill=&quot;white&quot; stroke-linecap=&quot;round&quot; stroke-linejoin=&quot;round&quot; d=&quot;M11.35 3.836c-.065.21-.1.433-.1.664 0 .414.336.75.75.75h4.5a.75.75 0 00.75-.75 2.25 2.25 0 00-.1-.664m-5.8 0A2.251 2.251 0 0113.5 2.25H15c1.012 0 1.867.668 2.15 1.586m-5.8 0c-.376.023-.75.05-1.124.08C9.095 4.01 8.25 4.973 8.25 6.108V8.25m8.9-4.414c.376.023.75.05 1.124.08 1.131.094 1.976 1.057 1.976 2.192V16.5A2.25 2.25 0 0118 18.75h-2.25m-7.5-10.5H4.875c-.621 0-1.125.504-1.125 1.125v11.25c0 .621.504 1.125 1.125 1.125h9.75c.621 0 1.125-.504 1.125-1.125V18.75m-7.5-10.5h6.375c.621 0 1.125.504 1.125 1.125v9.375m-8.25-3l1.5 1.5 3-3.75&quot; /&gt;
        &lt;/svg&gt;
    &lt;/button&gt;
&lt;/div&gt;&lt;pre class=&quot;phiki language-shellscript github-light&quot; data-language=&quot;shellscript&quot; style=&quot;background-color: #fff;color: #24292e;&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;token&quot; style=&quot;color: #6f42c1;&quot;&gt;php&lt;/span&gt;&lt;span class=&quot;token&quot;&gt; &lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #032f62;&quot;&gt;artisan&lt;/span&gt;&lt;span class=&quot;token&quot;&gt; &lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #032f62;&quot;&gt;make:listener&lt;/span&gt;&lt;span class=&quot;token&quot;&gt; &lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #032f62;&quot;&gt;UpdateUserLastLoggedAt&lt;/span&gt;&lt;span class=&quot;token&quot;&gt; &lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #005cc5;&quot;&gt;-&lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #005cc5;&quot;&gt;-event=Illuminate&lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #005cc5;&quot;&gt;\A&lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #005cc5;&quot;&gt;uth&lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #005cc5;&quot;&gt;\E&lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #005cc5;&quot;&gt;vents&lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #005cc5;&quot;&gt;\L&lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #005cc5;&quot;&gt;ogin&lt;/span&gt;&lt;span class=&quot;token&quot;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;And then implement the listener as follows:&lt;/p&gt;
&lt;div x-data=&quot;codeBlock&quot; class=&quot;code-block relative&quot;&gt;&lt;div class=&quot;flex space-x-2 items-center absolute top-0 right-0&quot;&gt;
    &lt;div x-cloak x-show=&quot;showMessage&quot; x-transition class=&quot;py-2 animate-bounce transition duration-300 mt-1 text-sky-500 text-xs&quot;&gt;Copied!&lt;/div&gt;
    &lt;button
        type=&quot;button&quot;
        title=&quot;Copy to clipboard&quot;
        class=&quot;hidden sm:block p-2 pl-3 transition duration-300&quot;
        @click.prevent=&quot;copyToClipboard&quot;
        :class=&quot;{
            'text-black/30 hover:text-black/80': !showMessage,
            'text-sky-500 hover:text-sky-700': showMessage,
        }&quot;&gt;
        &lt;svg xmlns=&quot;http://www.w3.org/2000/svg&quot; fill=&quot;none&quot; viewBox=&quot;0 0 24 24&quot; stroke-width=&quot;1.5&quot; stroke=&quot;currentColor&quot; class=&quot;block w-6 h-6&quot;&gt;
            &lt;path fill=&quot;white&quot; stroke-linecap=&quot;round&quot; stroke-linejoin=&quot;round&quot; d=&quot;M11.35 3.836c-.065.21-.1.433-.1.664 0 .414.336.75.75.75h4.5a.75.75 0 00.75-.75 2.25 2.25 0 00-.1-.664m-5.8 0A2.251 2.251 0 0113.5 2.25H15c1.012 0 1.867.668 2.15 1.586m-5.8 0c-.376.023-.75.05-1.124.08C9.095 4.01 8.25 4.973 8.25 6.108V8.25m8.9-4.414c.376.023.75.05 1.124.08 1.131.094 1.976 1.057 1.976 2.192V16.5A2.25 2.25 0 0118 18.75h-2.25m-7.5-10.5H4.875c-.621 0-1.125.504-1.125 1.125v11.25c0 .621.504 1.125 1.125 1.125h9.75c.621 0 1.125-.504 1.125-1.125V18.75m-7.5-10.5h6.375c.621 0 1.125.504 1.125 1.125v9.375m-8.25-3l1.5 1.5 3-3.75&quot; /&gt;
        &lt;/svg&gt;
    &lt;/button&gt;
&lt;/div&gt;&lt;pre class=&quot;phiki language-php github-light&quot; data-language=&quot;php&quot; style=&quot;background-color: #fff;color: #24292e;&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;token&quot; style=&quot;color: #d73a49;&quot;&gt;&amp;lt;&lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #d73a49;&quot;&gt;?&lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #005cc5;&quot;&gt;php&lt;/span&gt;&lt;span class=&quot;token&quot;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;token&quot;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;token&quot; style=&quot;color: #d73a49;&quot;&gt;namespace&lt;/span&gt;&lt;span class=&quot;token&quot;&gt; &lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #6f42c1;&quot;&gt;App&lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #6f42c1;&quot;&gt;\&lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #6f42c1;&quot;&gt;Listeners&lt;/span&gt;&lt;span class=&quot;token&quot;&gt;;&lt;/span&gt;&lt;span class=&quot;token&quot;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;token&quot;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;token&quot; style=&quot;color: #d73a49;&quot;&gt;use&lt;/span&gt;&lt;span class=&quot;token&quot;&gt; &lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #005cc5;&quot;&gt;App&lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #005cc5;&quot;&gt;\&lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #005cc5;&quot;&gt;Models&lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #005cc5;&quot;&gt;\&lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #005cc5;&quot;&gt;User&lt;/span&gt;&lt;span class=&quot;token&quot;&gt;;&lt;/span&gt;&lt;span class=&quot;token&quot;&gt; 
&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;token&quot; style=&quot;color: #d73a49;&quot;&gt;use&lt;/span&gt;&lt;span class=&quot;token&quot;&gt; &lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #005cc5;&quot;&gt;Illuminate&lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #005cc5;&quot;&gt;\&lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #005cc5;&quot;&gt;Auth&lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #005cc5;&quot;&gt;\&lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #005cc5;&quot;&gt;Events&lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #005cc5;&quot;&gt;\&lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #005cc5;&quot;&gt;Login&lt;/span&gt;&lt;span class=&quot;token&quot;&gt;;&lt;/span&gt;&lt;span class=&quot;token&quot;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;token&quot; style=&quot;color: #d73a49;&quot;&gt;use&lt;/span&gt;&lt;span class=&quot;token&quot;&gt; &lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #005cc5;&quot;&gt;Illuminate&lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #005cc5;&quot;&gt;\&lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #005cc5;&quot;&gt;Contracts&lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #005cc5;&quot;&gt;\&lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #005cc5;&quot;&gt;Queue&lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #005cc5;&quot;&gt;\&lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #005cc5;&quot;&gt;ShouldQueue&lt;/span&gt;&lt;span class=&quot;token&quot;&gt;;&lt;/span&gt;&lt;span class=&quot;token&quot;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;token&quot; style=&quot;color: #d73a49;&quot;&gt;use&lt;/span&gt;&lt;span class=&quot;token&quot;&gt; &lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #005cc5;&quot;&gt;Illuminate&lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #005cc5;&quot;&gt;\&lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #005cc5;&quot;&gt;Queue&lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #005cc5;&quot;&gt;\&lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #005cc5;&quot;&gt;InteractsWithQueue&lt;/span&gt;&lt;span class=&quot;token&quot;&gt;;&lt;/span&gt;&lt;span class=&quot;token&quot;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;token&quot;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;token&quot; style=&quot;color: #d73a49;&quot;&gt;class&lt;/span&gt;&lt;span class=&quot;token&quot;&gt; &lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #6f42c1;&quot;&gt;UpdateUserLastLoggedAt&lt;/span&gt;&lt;span class=&quot;token&quot;&gt; &lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #d73a49;&quot;&gt;implements&lt;/span&gt;&lt;span class=&quot;token&quot;&gt; &lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #6f42c1;&quot;&gt;ShouldQueue&lt;/span&gt;&lt;span class=&quot;token&quot;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;token&quot;&gt;{&lt;/span&gt;&lt;span class=&quot;token&quot;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;token&quot;&gt;    &lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #d73a49;&quot;&gt;use&lt;/span&gt;&lt;span class=&quot;token&quot;&gt; &lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #005cc5;&quot;&gt;InteractsWithQueue&lt;/span&gt;&lt;span class=&quot;token&quot;&gt;;&lt;/span&gt;&lt;span class=&quot;token&quot;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;token&quot;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;token&quot;&gt;    &lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #d73a49;&quot;&gt;public&lt;/span&gt;&lt;span class=&quot;token&quot;&gt; &lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #d73a49;&quot;&gt;function&lt;/span&gt;&lt;span class=&quot;token&quot;&gt; &lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #005cc5;&quot;&gt;__construct&lt;/span&gt;&lt;span class=&quot;token&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token&quot;&gt; &lt;/span&gt;&lt;span class=&quot;token&quot;&gt;{&lt;/span&gt;&lt;span class=&quot;token&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;token&quot;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;token&quot;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;token&quot;&gt;    &lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #d73a49;&quot;&gt;public&lt;/span&gt;&lt;span class=&quot;token&quot;&gt; &lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #d73a49;&quot;&gt;function&lt;/span&gt;&lt;span class=&quot;token&quot;&gt; &lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #6f42c1;&quot;&gt;handle&lt;/span&gt;&lt;span class=&quot;token&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #005cc5;&quot;&gt;Login&lt;/span&gt;&lt;span class=&quot;token&quot;&gt; &lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #24292e;&quot;&gt;$&lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #24292e;&quot;&gt;event&lt;/span&gt;&lt;span class=&quot;token&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #d73a49;&quot;&gt;:&lt;/span&gt;&lt;span class=&quot;token&quot;&gt; &lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #d73a49;&quot;&gt;void&lt;/span&gt;&lt;span class=&quot;token&quot;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;token&quot;&gt;    &lt;/span&gt;&lt;span class=&quot;token&quot;&gt;{&lt;/span&gt;&lt;span class=&quot;token&quot;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;token&quot;&gt;        &lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #6a737d;&quot;&gt;/**&lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #6a737d;&quot;&gt; &lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #d73a49;&quot;&gt;@var&lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #6a737d;&quot;&gt; &lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #005cc5;&quot;&gt;User&lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #6a737d;&quot;&gt; $user &lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #6a737d;&quot;&gt;*/&lt;/span&gt;&lt;span class=&quot;token&quot;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;token&quot;&gt;        &lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #24292e;&quot;&gt;$&lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #24292e;&quot;&gt;user&lt;/span&gt;&lt;span class=&quot;token&quot;&gt; &lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #d73a49;&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;token&quot;&gt; &lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #24292e;&quot;&gt;$&lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #24292e;&quot;&gt;event&lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #d73a49;&quot;&gt;-&amp;gt;&lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #24292e;&quot;&gt;user&lt;/span&gt;&lt;span class=&quot;token&quot;&gt;;&lt;/span&gt;&lt;span class=&quot;token&quot;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;token&quot;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;token&quot;&gt;        &lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #24292e;&quot;&gt;$&lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #24292e;&quot;&gt;user&lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #d73a49;&quot;&gt;-&amp;gt;&lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #6f42c1;&quot;&gt;update&lt;/span&gt;&lt;span class=&quot;token&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;token&quot;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;token&quot;&gt;            &lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #032f62;&quot;&gt;&amp;#039;&lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #032f62;&quot;&gt;last_logged_at&lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #032f62;&quot;&gt;&amp;#039;&lt;/span&gt;&lt;span class=&quot;token&quot;&gt; &lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #d73a49;&quot;&gt;=&amp;gt;&lt;/span&gt;&lt;span class=&quot;token&quot;&gt; &lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #6f42c1;&quot;&gt;now&lt;/span&gt;&lt;span class=&quot;token&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token&quot;&gt;,&lt;/span&gt;&lt;span class=&quot;token&quot;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;token&quot;&gt;        &lt;/span&gt;&lt;span class=&quot;token&quot;&gt;]&lt;/span&gt;&lt;span class=&quot;token&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token&quot;&gt;;&lt;/span&gt;&lt;span class=&quot;token&quot;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;token&quot;&gt;    &lt;/span&gt;&lt;span class=&quot;token&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;token&quot;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;token&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;token&quot;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;blockquote&gt;
&lt;p&gt;By default, Laravel will automatically find and register your event listeners by scanning your application's Listeners directory. When Laravel finds any listener class method that begins with handle or __invoke, Laravel will register those methods as event listeners for the event that is type-hinted in the method's signature.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;— &lt;a href=&quot;https://laravel.com/docs/12.x/events#defining-listeners&quot;&gt;https://laravel.com/docs/12.x/events#defining-listeners&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;Oh and don't forget to add the &lt;code&gt;last_logged_at&lt;/code&gt; field to your &lt;code&gt;users&lt;/code&gt; table migration:&lt;/p&gt;
&lt;div x-data=&quot;codeBlock&quot; class=&quot;code-block relative&quot;&gt;&lt;div class=&quot;flex space-x-2 items-center absolute top-0 right-0&quot;&gt;
    &lt;div x-cloak x-show=&quot;showMessage&quot; x-transition class=&quot;py-2 animate-bounce transition duration-300 mt-1 text-sky-500 text-xs&quot;&gt;Copied!&lt;/div&gt;
    &lt;button
        type=&quot;button&quot;
        title=&quot;Copy to clipboard&quot;
        class=&quot;hidden sm:block p-2 pl-3 transition duration-300&quot;
        @click.prevent=&quot;copyToClipboard&quot;
        :class=&quot;{
            'text-black/30 hover:text-black/80': !showMessage,
            'text-sky-500 hover:text-sky-700': showMessage,
        }&quot;&gt;
        &lt;svg xmlns=&quot;http://www.w3.org/2000/svg&quot; fill=&quot;none&quot; viewBox=&quot;0 0 24 24&quot; stroke-width=&quot;1.5&quot; stroke=&quot;currentColor&quot; class=&quot;block w-6 h-6&quot;&gt;
            &lt;path fill=&quot;white&quot; stroke-linecap=&quot;round&quot; stroke-linejoin=&quot;round&quot; d=&quot;M11.35 3.836c-.065.21-.1.433-.1.664 0 .414.336.75.75.75h4.5a.75.75 0 00.75-.75 2.25 2.25 0 00-.1-.664m-5.8 0A2.251 2.251 0 0113.5 2.25H15c1.012 0 1.867.668 2.15 1.586m-5.8 0c-.376.023-.75.05-1.124.08C9.095 4.01 8.25 4.973 8.25 6.108V8.25m8.9-4.414c.376.023.75.05 1.124.08 1.131.094 1.976 1.057 1.976 2.192V16.5A2.25 2.25 0 0118 18.75h-2.25m-7.5-10.5H4.875c-.621 0-1.125.504-1.125 1.125v11.25c0 .621.504 1.125 1.125 1.125h9.75c.621 0 1.125-.504 1.125-1.125V18.75m-7.5-10.5h6.375c.621 0 1.125.504 1.125 1.125v9.375m-8.25-3l1.5 1.5 3-3.75&quot; /&gt;
        &lt;/svg&gt;
    &lt;/button&gt;
&lt;/div&gt;&lt;pre class=&quot;phiki language-shellscript github-light&quot; data-language=&quot;shellscript&quot; style=&quot;background-color: #fff;color: #24292e;&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;token&quot; style=&quot;color: #6f42c1;&quot;&gt;php&lt;/span&gt;&lt;span class=&quot;token&quot;&gt; &lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #032f62;&quot;&gt;artisan&lt;/span&gt;&lt;span class=&quot;token&quot;&gt; &lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #032f62;&quot;&gt;make:migration&lt;/span&gt;&lt;span class=&quot;token&quot;&gt; &lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #032f62;&quot;&gt;add_last_logged_at_to_users_table&lt;/span&gt;&lt;span class=&quot;token&quot;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;Then, in the migration file, you can add the new column:&lt;/p&gt;
&lt;div x-data=&quot;codeBlock&quot; class=&quot;code-block relative&quot;&gt;&lt;div class=&quot;flex space-x-2 items-center absolute top-0 right-0&quot;&gt;
    &lt;div x-cloak x-show=&quot;showMessage&quot; x-transition class=&quot;py-2 animate-bounce transition duration-300 mt-1 text-sky-500 text-xs&quot;&gt;Copied!&lt;/div&gt;
    &lt;button
        type=&quot;button&quot;
        title=&quot;Copy to clipboard&quot;
        class=&quot;hidden sm:block p-2 pl-3 transition duration-300&quot;
        @click.prevent=&quot;copyToClipboard&quot;
        :class=&quot;{
            'text-black/30 hover:text-black/80': !showMessage,
            'text-sky-500 hover:text-sky-700': showMessage,
        }&quot;&gt;
        &lt;svg xmlns=&quot;http://www.w3.org/2000/svg&quot; fill=&quot;none&quot; viewBox=&quot;0 0 24 24&quot; stroke-width=&quot;1.5&quot; stroke=&quot;currentColor&quot; class=&quot;block w-6 h-6&quot;&gt;
            &lt;path fill=&quot;white&quot; stroke-linecap=&quot;round&quot; stroke-linejoin=&quot;round&quot; d=&quot;M11.35 3.836c-.065.21-.1.433-.1.664 0 .414.336.75.75.75h4.5a.75.75 0 00.75-.75 2.25 2.25 0 00-.1-.664m-5.8 0A2.251 2.251 0 0113.5 2.25H15c1.012 0 1.867.668 2.15 1.586m-5.8 0c-.376.023-.75.05-1.124.08C9.095 4.01 8.25 4.973 8.25 6.108V8.25m8.9-4.414c.376.023.75.05 1.124.08 1.131.094 1.976 1.057 1.976 2.192V16.5A2.25 2.25 0 0118 18.75h-2.25m-7.5-10.5H4.875c-.621 0-1.125.504-1.125 1.125v11.25c0 .621.504 1.125 1.125 1.125h9.75c.621 0 1.125-.504 1.125-1.125V18.75m-7.5-10.5h6.375c.621 0 1.125.504 1.125 1.125v9.375m-8.25-3l1.5 1.5 3-3.75&quot; /&gt;
        &lt;/svg&gt;
    &lt;/button&gt;
&lt;/div&gt;&lt;pre class=&quot;phiki language-php github-light&quot; data-language=&quot;php&quot; style=&quot;background-color: #fff;color: #24292e;&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;token&quot; style=&quot;color: #005cc5;&quot;&gt;Schema&lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #d73a49;&quot;&gt;::&lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #6f42c1;&quot;&gt;table&lt;/span&gt;&lt;span class=&quot;token&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #032f62;&quot;&gt;&amp;#039;&lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #032f62;&quot;&gt;users&lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #032f62;&quot;&gt;&amp;#039;&lt;/span&gt;&lt;span class=&quot;token&quot;&gt;,&lt;/span&gt;&lt;span class=&quot;token&quot;&gt; &lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #d73a49;&quot;&gt;function&lt;/span&gt;&lt;span class=&quot;token&quot;&gt; &lt;/span&gt;&lt;span class=&quot;token&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #005cc5;&quot;&gt;Blueprint&lt;/span&gt;&lt;span class=&quot;token&quot;&gt; &lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #24292e;&quot;&gt;$&lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #24292e;&quot;&gt;table&lt;/span&gt;&lt;span class=&quot;token&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token&quot;&gt; &lt;/span&gt;&lt;span class=&quot;token&quot;&gt;{&lt;/span&gt;&lt;span class=&quot;token&quot;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;token&quot;&gt;    &lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #24292e;&quot;&gt;$&lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #24292e;&quot;&gt;table&lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #d73a49;&quot;&gt;-&amp;gt;&lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #6f42c1;&quot;&gt;timestamp&lt;/span&gt;&lt;span class=&quot;token&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #032f62;&quot;&gt;&amp;#039;&lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #032f62;&quot;&gt;last_logged_at&lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #032f62;&quot;&gt;&amp;#039;&lt;/span&gt;&lt;span class=&quot;token&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #d73a49;&quot;&gt;-&amp;gt;&lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #6f42c1;&quot;&gt;nullable&lt;/span&gt;&lt;span class=&quot;token&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token&quot;&gt;;&lt;/span&gt;&lt;span class=&quot;token&quot;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;token&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;token&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token&quot;&gt;;&lt;/span&gt;&lt;span class=&quot;token&quot;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;And run the migration:&lt;/p&gt;
&lt;div x-data=&quot;codeBlock&quot; class=&quot;code-block relative&quot;&gt;&lt;div class=&quot;flex space-x-2 items-center absolute top-0 right-0&quot;&gt;
    &lt;div x-cloak x-show=&quot;showMessage&quot; x-transition class=&quot;py-2 animate-bounce transition duration-300 mt-1 text-sky-500 text-xs&quot;&gt;Copied!&lt;/div&gt;
    &lt;button
        type=&quot;button&quot;
        title=&quot;Copy to clipboard&quot;
        class=&quot;hidden sm:block p-2 pl-3 transition duration-300&quot;
        @click.prevent=&quot;copyToClipboard&quot;
        :class=&quot;{
            'text-black/30 hover:text-black/80': !showMessage,
            'text-sky-500 hover:text-sky-700': showMessage,
        }&quot;&gt;
        &lt;svg xmlns=&quot;http://www.w3.org/2000/svg&quot; fill=&quot;none&quot; viewBox=&quot;0 0 24 24&quot; stroke-width=&quot;1.5&quot; stroke=&quot;currentColor&quot; class=&quot;block w-6 h-6&quot;&gt;
            &lt;path fill=&quot;white&quot; stroke-linecap=&quot;round&quot; stroke-linejoin=&quot;round&quot; d=&quot;M11.35 3.836c-.065.21-.1.433-.1.664 0 .414.336.75.75.75h4.5a.75.75 0 00.75-.75 2.25 2.25 0 00-.1-.664m-5.8 0A2.251 2.251 0 0113.5 2.25H15c1.012 0 1.867.668 2.15 1.586m-5.8 0c-.376.023-.75.05-1.124.08C9.095 4.01 8.25 4.973 8.25 6.108V8.25m8.9-4.414c.376.023.75.05 1.124.08 1.131.094 1.976 1.057 1.976 2.192V16.5A2.25 2.25 0 0118 18.75h-2.25m-7.5-10.5H4.875c-.621 0-1.125.504-1.125 1.125v11.25c0 .621.504 1.125 1.125 1.125h9.75c.621 0 1.125-.504 1.125-1.125V18.75m-7.5-10.5h6.375c.621 0 1.125.504 1.125 1.125v9.375m-8.25-3l1.5 1.5 3-3.75&quot; /&gt;
        &lt;/svg&gt;
    &lt;/button&gt;
&lt;/div&gt;&lt;pre class=&quot;phiki language-shellscript github-light&quot; data-language=&quot;shellscript&quot; style=&quot;background-color: #fff;color: #24292e;&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;token&quot; style=&quot;color: #6f42c1;&quot;&gt;php&lt;/span&gt;&lt;span class=&quot;token&quot;&gt; &lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #032f62;&quot;&gt;artisan&lt;/span&gt;&lt;span class=&quot;token&quot;&gt; &lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #032f62;&quot;&gt;migrate&lt;/span&gt;&lt;span class=&quot;token&quot;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;h2&gt;&lt;a id=&quot;content-some-notes&quot; href=&quot;#content-some-notes&quot; class=&quot;heading-permalink&quot; aria-hidden=&quot;true&quot; tabindex=&quot;-1&quot; title=&quot;Permalink&quot;&gt;#&lt;/a&gt;Some notes&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;The &lt;code&gt;last_logged_at&lt;/code&gt; field is nullable, so it will be &lt;code&gt;null&lt;/code&gt; for users who have never logged in.&lt;/li&gt;
&lt;li&gt;The &lt;code&gt;UpdateUserLastLoggedAt&lt;/code&gt; listener implements the &lt;code&gt;ShouldQueue&lt;/code&gt; interface, which means it will be queued for processing. This is preferable if you want to avoid slowing down the login process.&lt;/li&gt;
&lt;li&gt;This works with Breeze, Jetstream, and Sanctum as they all use the &lt;code&gt;Illuminate\Auth\Events\Login&lt;/code&gt; event.&lt;/li&gt;
&lt;li&gt;If you wanna go further, the &lt;code&gt;Login&lt;/code&gt; event also provides the following properties:
&lt;ul&gt;
&lt;li&gt;string &lt;strong&gt;$guard&lt;/strong&gt; – The authentication guard name.&lt;/li&gt;
&lt;li&gt;Authenticatable &lt;strong&gt;$user&lt;/strong&gt; – The authenticated user.&lt;/li&gt;
&lt;li&gt;bool &lt;strong&gt;$remember&lt;/strong&gt; – Indicates if the user should be &amp;quot;remembered&amp;quot;.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;</content>
        <author>
            <name>Eser DENIZ</name>
        </author>
    </entry>
    <entry>
        <title type="text">How to automatically control the Raspberry Pi fan with Home Assistant</title>
        <link href="https://srwiez.com/posts/how-to-automatically-control-the-raspberry-pi-fan-with-home-assistant"/>
        <id>https://srwiez.com/posts/how-to-automatically-control-the-raspberry-pi-fan-with-home-assistant</id>
        <published>2025-06-09T00:00:00+00:00</published>
        <updated>2025-06-09T11:49:49+00:00</updated>
        <summary type="text">&lt;p&gt;I've set up a Raspberry Pi 4 with Home Assistant in my van. To manage its cooling, I want to programmatically control the fan through Home Assistant, triggering it only when the CPU temperature exceeds a specific threshold.&lt;/p&gt;
&lt;!-- more --&gt;
&lt;ul class=&quot;table-of-contents not-prose&quot;&gt;
&lt;li&gt;&lt;a href=&quot;#content-hardware-setup&quot;&gt;Hardware Setup&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;#content-software-requirements&quot;&gt;Software Requirements&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;#content-configuration&quot;&gt;Configuration&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;#content-result&quot;&gt;Result&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;&lt;a id=&quot;content-hardware-setup&quot; href=&quot;#content-hardware-setup&quot; class=&quot;heading-permalink&quot; aria-hidden=&quot;true&quot; tabindex=&quot;-1&quot; title=&quot;Permalink&quot;&gt;#&lt;/a&gt;Hardware Setup&lt;/h2&gt;
&lt;p&gt;I used a 5V fan connected to the Raspberry Pi's GPIO pins.&lt;/p&gt;
&lt;p&gt;The little fan has three cables:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Red&lt;/strong&gt;: Power (5V)&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Black&lt;/strong&gt;: Ground (GND)&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Blue&lt;/strong&gt;: Control signal&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;I connected the blue cable to GPIO 14, which is not a PWM-capable pin on the Raspberry Pi, but it works fine for simple on/off control.&lt;/p&gt;
&lt;h2&gt;&lt;a id=&quot;content-software-requirements&quot; href=&quot;#content-software-requirements&quot; class=&quot;heading-permalink&quot; aria-hidden=&quot;true&quot; tabindex=&quot;-1&quot; title=&quot;Permalink&quot;&gt;#&lt;/a&gt;Software Requirements&lt;/h2&gt;
&lt;p&gt;To control the GPIOs from Home Assistant, you need to install the following component in this order:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;&lt;a href=&quot;https://hacs.xyz/docs/use/&quot;&gt;HACS&lt;/a&gt; - the Home Assistant Community Store&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://github.com/thecode/ha-rpi_gpio&quot;&gt;HA RPi GPIO&lt;/a&gt; - a plugin to control the GPIO pins of the Raspberry Pi&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;I let you read the documentation of these components to install them correctly.&lt;/p&gt;
&lt;p&gt;Once you installed HACS, you can install the RPi GPIO plugin from the HACS dashboard on your Home Assistant instance.&lt;/p&gt;
&lt;h2&gt;&lt;a id=&quot;content-configuration&quot; href=&quot;#content-configuration&quot; class=&quot;heading-permalink&quot; aria-hidden=&quot;true&quot; tabindex=&quot;-1&quot; title=&quot;Permalink&quot;&gt;#&lt;/a&gt;Configuration&lt;/h2&gt;
&lt;p&gt;In your &lt;code&gt;configuration.yaml&lt;/code&gt; file, add the following lines to configure the GPIO pin for the fan:&lt;/p&gt;
&lt;div x-data=&quot;codeBlock&quot; class=&quot;code-block relative&quot;&gt;&lt;div class=&quot;flex space-x-2 items-center absolute top-0 right-0&quot;&gt;
    &lt;div x-cloak x-show=&quot;showMessage&quot; x-transition class=&quot;py-2 animate-bounce transition duration-300 mt-1 text-sky-500 text-xs&quot;&gt;Copied!&lt;/div&gt;
    &lt;button
        type=&quot;button&quot;
        title=&quot;Copy to clipboard&quot;
        class=&quot;hidden sm:block p-2 pl-3 transition duration-300&quot;
        @click.prevent=&quot;copyToClipboard&quot;
        :class=&quot;{
            'text-black/30 hover:text-black/80': !showMessage,
            'text-sky-500 hover:text-sky-700': showMessage,
        }&quot;&gt;
        &lt;svg xmlns=&quot;http://www.w3.org/2000/svg&quot; fill=&quot;none&quot; viewBox=&quot;0 0 24 24&quot; stroke-width=&quot;1.5&quot; stroke=&quot;currentColor&quot; class=&quot;block w-6 h-6&quot;&gt;
            &lt;path fill=&quot;white&quot; stroke-linecap=&quot;round&quot; stroke-linejoin=&quot;round&quot; d=&quot;M11.35 3.836c-.065.21-.1.433-.1.664 0 .414.336.75.75.75h4.5a.75.75 0 00.75-.75 2.25 2.25 0 00-.1-.664m-5.8 0A2.251 2.251 0 0113.5 2.25H15c1.012 0 1.867.668 2.15 1.586m-5.8 0c-.376.023-.75.05-1.124.08C9.095 4.01 8.25 4.973 8.25 6.108V8.25m8.9-4.414c.376.023.75.05 1.124.08 1.131.094 1.976 1.057 1.976 2.192V16.5A2.25 2.25 0 0118 18.75h-2.25m-7.5-10.5H4.875c-.621 0-1.125.504-1.125 1.125v11.25c0 .621.504 1.125 1.125 1.125h9.75c.621 0 1.125-.504 1.125-1.125V18.75m-7.5-10.5h6.375c.621 0 1.125.504 1.125 1.125v9.375m-8.25-3l1.5 1.5 3-3.75&quot; /&gt;
        &lt;/svg&gt;
    &lt;/button&gt;
&lt;/div&gt;&lt;pre class=&quot;phiki language-yaml github-light&quot; data-language=&quot;yaml&quot; style=&quot;background-color: #fff;color: #24292e;&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;token&quot; style=&quot;color: #22863a;&quot;&gt;s&lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #22863a;&quot;&gt;witch&lt;/span&gt;&lt;span class=&quot;token&quot;&gt;:&lt;/span&gt;&lt;span class=&quot;token&quot;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;token&quot;&gt;  &lt;/span&gt;&lt;span class=&quot;token&quot;&gt;-&lt;/span&gt;&lt;span class=&quot;token&quot;&gt; &lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #22863a;&quot;&gt;p&lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #22863a;&quot;&gt;latform&lt;/span&gt;&lt;span class=&quot;token&quot;&gt;:&lt;/span&gt;&lt;span class=&quot;token&quot;&gt; &lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #032f62;&quot;&gt;r&lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #032f62;&quot;&gt;pi_gpio&lt;/span&gt;&lt;span class=&quot;token&quot;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;token&quot;&gt;    &lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #22863a;&quot;&gt;s&lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #22863a;&quot;&gt;witches&lt;/span&gt;&lt;span class=&quot;token&quot;&gt;:&lt;/span&gt;&lt;span class=&quot;token&quot;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;token&quot;&gt;      &lt;/span&gt;&lt;span class=&quot;token&quot;&gt;-&lt;/span&gt;&lt;span class=&quot;token&quot;&gt; &lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #22863a;&quot;&gt;p&lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #22863a;&quot;&gt;ort&lt;/span&gt;&lt;span class=&quot;token&quot;&gt;:&lt;/span&gt;&lt;span class=&quot;token&quot;&gt; &lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #005cc5;&quot;&gt;14&lt;/span&gt;&lt;span class=&quot;token&quot;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;token&quot;&gt;        &lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #22863a;&quot;&gt;n&lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #22863a;&quot;&gt;ame&lt;/span&gt;&lt;span class=&quot;token&quot;&gt;:&lt;/span&gt;&lt;span class=&quot;token&quot;&gt; &lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #032f62;&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #032f62;&quot;&gt;RPI Cooling Fan&lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #032f62;&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span class=&quot;token&quot;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;token&quot;&gt;        &lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #22863a;&quot;&gt;u&lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #22863a;&quot;&gt;nique_id&lt;/span&gt;&lt;span class=&quot;token&quot;&gt;:&lt;/span&gt;&lt;span class=&quot;token&quot;&gt; &lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #032f62;&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #032f62;&quot;&gt;rpi_cooling_fan&lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #032f62;&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span class=&quot;token&quot;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;token&quot;&gt;        
&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;token&quot; style=&quot;color: #22863a;&quot;&gt;c&lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #22863a;&quot;&gt;limate&lt;/span&gt;&lt;span class=&quot;token&quot;&gt;:&lt;/span&gt;&lt;span class=&quot;token&quot;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;token&quot;&gt;  &lt;/span&gt;&lt;span class=&quot;token&quot;&gt;-&lt;/span&gt;&lt;span class=&quot;token&quot;&gt; &lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #22863a;&quot;&gt;p&lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #22863a;&quot;&gt;latform&lt;/span&gt;&lt;span class=&quot;token&quot;&gt;:&lt;/span&gt;&lt;span class=&quot;token&quot;&gt; &lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #032f62;&quot;&gt;g&lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #032f62;&quot;&gt;eneric_thermostat&lt;/span&gt;&lt;span class=&quot;token&quot;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;token&quot;&gt;    &lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #22863a;&quot;&gt;n&lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #22863a;&quot;&gt;ame&lt;/span&gt;&lt;span class=&quot;token&quot;&gt;:&lt;/span&gt;&lt;span class=&quot;token&quot;&gt; &lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #032f62;&quot;&gt;R&lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #032f62;&quot;&gt;PI Cooling Fan Controller&lt;/span&gt;&lt;span class=&quot;token&quot;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;token&quot;&gt;    &lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #22863a;&quot;&gt;u&lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #22863a;&quot;&gt;nique_id&lt;/span&gt;&lt;span class=&quot;token&quot;&gt;:&lt;/span&gt;&lt;span class=&quot;token&quot;&gt; &lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #032f62;&quot;&gt;r&lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #032f62;&quot;&gt;pi_cooling_fan_controller&lt;/span&gt;&lt;span class=&quot;token&quot;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;token&quot;&gt;    &lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #22863a;&quot;&gt;h&lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #22863a;&quot;&gt;eater&lt;/span&gt;&lt;span class=&quot;token&quot;&gt;:&lt;/span&gt;&lt;span class=&quot;token&quot;&gt; &lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #032f62;&quot;&gt;s&lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #032f62;&quot;&gt;witch.rpi_cooling_fan&lt;/span&gt;&lt;span class=&quot;token&quot;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;token&quot;&gt;    &lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #22863a;&quot;&gt;t&lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #22863a;&quot;&gt;arget_sensor&lt;/span&gt;&lt;span class=&quot;token&quot;&gt;:&lt;/span&gt;&lt;span class=&quot;token&quot;&gt; &lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #032f62;&quot;&gt;s&lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #032f62;&quot;&gt;ensor.system_monitor_processor_temperature&lt;/span&gt;&lt;span class=&quot;token&quot;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;token&quot;&gt;    &lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #22863a;&quot;&gt;m&lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #22863a;&quot;&gt;in_temp&lt;/span&gt;&lt;span class=&quot;token&quot;&gt;:&lt;/span&gt;&lt;span class=&quot;token&quot;&gt; &lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #005cc5;&quot;&gt;45&lt;/span&gt;&lt;span class=&quot;token&quot;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;token&quot;&gt;    &lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #22863a;&quot;&gt;m&lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #22863a;&quot;&gt;ax_temp&lt;/span&gt;&lt;span class=&quot;token&quot;&gt;:&lt;/span&gt;&lt;span class=&quot;token&quot;&gt; &lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #005cc5;&quot;&gt;80&lt;/span&gt;&lt;span class=&quot;token&quot;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;token&quot;&gt;    &lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #22863a;&quot;&gt;a&lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #22863a;&quot;&gt;c_mode&lt;/span&gt;&lt;span class=&quot;token&quot;&gt;:&lt;/span&gt;&lt;span class=&quot;token&quot;&gt; &lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #005cc5;&quot;&gt;true&lt;/span&gt;&lt;span class=&quot;token&quot;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;token&quot;&gt;    &lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #22863a;&quot;&gt;t&lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #22863a;&quot;&gt;arget_temp&lt;/span&gt;&lt;span class=&quot;token&quot;&gt;:&lt;/span&gt;&lt;span class=&quot;token&quot;&gt; &lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #005cc5;&quot;&gt;55&lt;/span&gt;&lt;span class=&quot;token&quot;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;token&quot;&gt;    &lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #22863a;&quot;&gt;c&lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #22863a;&quot;&gt;old_tolerance&lt;/span&gt;&lt;span class=&quot;token&quot;&gt;:&lt;/span&gt;&lt;span class=&quot;token&quot;&gt; &lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #005cc5;&quot;&gt;0.5&lt;/span&gt;&lt;span class=&quot;token&quot;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;token&quot;&gt;    &lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #22863a;&quot;&gt;h&lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #22863a;&quot;&gt;ot_tolerance&lt;/span&gt;&lt;span class=&quot;token&quot;&gt;:&lt;/span&gt;&lt;span class=&quot;token&quot;&gt; &lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #005cc5;&quot;&gt;0.5&lt;/span&gt;&lt;span class=&quot;token&quot;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;token&quot;&gt;    &lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #22863a;&quot;&gt;m&lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #22863a;&quot;&gt;in_cycle_duration&lt;/span&gt;&lt;span class=&quot;token&quot;&gt;:&lt;/span&gt;&lt;span class=&quot;token&quot;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;token&quot;&gt;      &lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #22863a;&quot;&gt;s&lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #22863a;&quot;&gt;econds&lt;/span&gt;&lt;span class=&quot;token&quot;&gt;:&lt;/span&gt;&lt;span class=&quot;token&quot;&gt; &lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #005cc5;&quot;&gt;60&lt;/span&gt;&lt;span class=&quot;token&quot;&gt; &lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #6a737d;&quot;&gt;#&lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #6a737d;&quot;&gt; Minimum time the fan should run before turning off&lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #6a737d;&quot;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;token&quot;&gt;    &lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #22863a;&quot;&gt;k&lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #22863a;&quot;&gt;eep_alive&lt;/span&gt;&lt;span class=&quot;token&quot;&gt;:&lt;/span&gt;&lt;span class=&quot;token&quot;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;token&quot;&gt;      &lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #22863a;&quot;&gt;m&lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #22863a;&quot;&gt;inutes&lt;/span&gt;&lt;span class=&quot;token&quot;&gt;:&lt;/span&gt;&lt;span class=&quot;token&quot;&gt; &lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #005cc5;&quot;&gt;5&lt;/span&gt;&lt;span class=&quot;token&quot;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;token&quot;&gt;    &lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #22863a;&quot;&gt;i&lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #22863a;&quot;&gt;nitial_hvac_mode&lt;/span&gt;&lt;span class=&quot;token&quot;&gt;:&lt;/span&gt;&lt;span class=&quot;token&quot;&gt; &lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #032f62;&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #032f62;&quot;&gt;cool&lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #032f62;&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span class=&quot;token&quot;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;This configuration does the following:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Defines a switch for the fan connected to GPIO 14.&lt;/li&gt;
&lt;li&gt;Sets up a generic thermostat that uses the fan as a heater.&lt;/li&gt;
&lt;li&gt;Monitors the CPU temperature using the &lt;code&gt;sensor.system_monitor_processor_temperature&lt;/code&gt; sensor.&lt;/li&gt;
&lt;li&gt;Sets the target temperature to 55°C, with a minimum and maximum temperature range of 45°C and 80°C, respectively.&lt;/li&gt;
&lt;li&gt;Configures the thermostat to run the fan for at least 60 seconds before turning it off, and keeps it alive for 5 minutes after the last activation.&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;&lt;a id=&quot;content-result&quot; href=&quot;#content-result&quot; class=&quot;heading-permalink&quot; aria-hidden=&quot;true&quot; tabindex=&quot;-1&quot; title=&quot;Permalink&quot;&gt;#&lt;/a&gt;Result&lt;/h2&gt;
&lt;p&gt;&lt;img src=&quot;https://assets.srwiez.com/hass-rpi-fan/capture-decran-2025-06-09-a-13.43.30.png&quot; alt=&quot;Card with al the entities&quot; /&gt;&lt;br /&gt;
&lt;img src=&quot;https://assets.srwiez.com/hass-rpi-fan/capture-decran-2025-06-09-a-13.43.40.png&quot; alt=&quot;Card of the thermostat&quot; /&gt;&lt;/p&gt;</summary>
        <content type="html">&lt;p&gt;I've set up a Raspberry Pi 4 with Home Assistant in my van. To manage its cooling, I want to programmatically control the fan through Home Assistant, triggering it only when the CPU temperature exceeds a specific threshold.&lt;/p&gt;
&lt;!-- more --&gt;
&lt;ul class=&quot;table-of-contents not-prose&quot;&gt;
&lt;li&gt;&lt;a href=&quot;#content-hardware-setup&quot;&gt;Hardware Setup&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;#content-software-requirements&quot;&gt;Software Requirements&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;#content-configuration&quot;&gt;Configuration&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;#content-result&quot;&gt;Result&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;&lt;a id=&quot;content-hardware-setup&quot; href=&quot;#content-hardware-setup&quot; class=&quot;heading-permalink&quot; aria-hidden=&quot;true&quot; tabindex=&quot;-1&quot; title=&quot;Permalink&quot;&gt;#&lt;/a&gt;Hardware Setup&lt;/h2&gt;
&lt;p&gt;I used a 5V fan connected to the Raspberry Pi's GPIO pins.&lt;/p&gt;
&lt;p&gt;The little fan has three cables:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Red&lt;/strong&gt;: Power (5V)&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Black&lt;/strong&gt;: Ground (GND)&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Blue&lt;/strong&gt;: Control signal&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;I connected the blue cable to GPIO 14, which is not a PWM-capable pin on the Raspberry Pi, but it works fine for simple on/off control.&lt;/p&gt;
&lt;h2&gt;&lt;a id=&quot;content-software-requirements&quot; href=&quot;#content-software-requirements&quot; class=&quot;heading-permalink&quot; aria-hidden=&quot;true&quot; tabindex=&quot;-1&quot; title=&quot;Permalink&quot;&gt;#&lt;/a&gt;Software Requirements&lt;/h2&gt;
&lt;p&gt;To control the GPIOs from Home Assistant, you need to install the following component in this order:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;&lt;a href=&quot;https://hacs.xyz/docs/use/&quot;&gt;HACS&lt;/a&gt; - the Home Assistant Community Store&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://github.com/thecode/ha-rpi_gpio&quot;&gt;HA RPi GPIO&lt;/a&gt; - a plugin to control the GPIO pins of the Raspberry Pi&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;I let you read the documentation of these components to install them correctly.&lt;/p&gt;
&lt;p&gt;Once you installed HACS, you can install the RPi GPIO plugin from the HACS dashboard on your Home Assistant instance.&lt;/p&gt;
&lt;h2&gt;&lt;a id=&quot;content-configuration&quot; href=&quot;#content-configuration&quot; class=&quot;heading-permalink&quot; aria-hidden=&quot;true&quot; tabindex=&quot;-1&quot; title=&quot;Permalink&quot;&gt;#&lt;/a&gt;Configuration&lt;/h2&gt;
&lt;p&gt;In your &lt;code&gt;configuration.yaml&lt;/code&gt; file, add the following lines to configure the GPIO pin for the fan:&lt;/p&gt;
&lt;div x-data=&quot;codeBlock&quot; class=&quot;code-block relative&quot;&gt;&lt;div class=&quot;flex space-x-2 items-center absolute top-0 right-0&quot;&gt;
    &lt;div x-cloak x-show=&quot;showMessage&quot; x-transition class=&quot;py-2 animate-bounce transition duration-300 mt-1 text-sky-500 text-xs&quot;&gt;Copied!&lt;/div&gt;
    &lt;button
        type=&quot;button&quot;
        title=&quot;Copy to clipboard&quot;
        class=&quot;hidden sm:block p-2 pl-3 transition duration-300&quot;
        @click.prevent=&quot;copyToClipboard&quot;
        :class=&quot;{
            'text-black/30 hover:text-black/80': !showMessage,
            'text-sky-500 hover:text-sky-700': showMessage,
        }&quot;&gt;
        &lt;svg xmlns=&quot;http://www.w3.org/2000/svg&quot; fill=&quot;none&quot; viewBox=&quot;0 0 24 24&quot; stroke-width=&quot;1.5&quot; stroke=&quot;currentColor&quot; class=&quot;block w-6 h-6&quot;&gt;
            &lt;path fill=&quot;white&quot; stroke-linecap=&quot;round&quot; stroke-linejoin=&quot;round&quot; d=&quot;M11.35 3.836c-.065.21-.1.433-.1.664 0 .414.336.75.75.75h4.5a.75.75 0 00.75-.75 2.25 2.25 0 00-.1-.664m-5.8 0A2.251 2.251 0 0113.5 2.25H15c1.012 0 1.867.668 2.15 1.586m-5.8 0c-.376.023-.75.05-1.124.08C9.095 4.01 8.25 4.973 8.25 6.108V8.25m8.9-4.414c.376.023.75.05 1.124.08 1.131.094 1.976 1.057 1.976 2.192V16.5A2.25 2.25 0 0118 18.75h-2.25m-7.5-10.5H4.875c-.621 0-1.125.504-1.125 1.125v11.25c0 .621.504 1.125 1.125 1.125h9.75c.621 0 1.125-.504 1.125-1.125V18.75m-7.5-10.5h6.375c.621 0 1.125.504 1.125 1.125v9.375m-8.25-3l1.5 1.5 3-3.75&quot; /&gt;
        &lt;/svg&gt;
    &lt;/button&gt;
&lt;/div&gt;&lt;pre class=&quot;phiki language-yaml github-light&quot; data-language=&quot;yaml&quot; style=&quot;background-color: #fff;color: #24292e;&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;token&quot; style=&quot;color: #22863a;&quot;&gt;s&lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #22863a;&quot;&gt;witch&lt;/span&gt;&lt;span class=&quot;token&quot;&gt;:&lt;/span&gt;&lt;span class=&quot;token&quot;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;token&quot;&gt;  &lt;/span&gt;&lt;span class=&quot;token&quot;&gt;-&lt;/span&gt;&lt;span class=&quot;token&quot;&gt; &lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #22863a;&quot;&gt;p&lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #22863a;&quot;&gt;latform&lt;/span&gt;&lt;span class=&quot;token&quot;&gt;:&lt;/span&gt;&lt;span class=&quot;token&quot;&gt; &lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #032f62;&quot;&gt;r&lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #032f62;&quot;&gt;pi_gpio&lt;/span&gt;&lt;span class=&quot;token&quot;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;token&quot;&gt;    &lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #22863a;&quot;&gt;s&lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #22863a;&quot;&gt;witches&lt;/span&gt;&lt;span class=&quot;token&quot;&gt;:&lt;/span&gt;&lt;span class=&quot;token&quot;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;token&quot;&gt;      &lt;/span&gt;&lt;span class=&quot;token&quot;&gt;-&lt;/span&gt;&lt;span class=&quot;token&quot;&gt; &lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #22863a;&quot;&gt;p&lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #22863a;&quot;&gt;ort&lt;/span&gt;&lt;span class=&quot;token&quot;&gt;:&lt;/span&gt;&lt;span class=&quot;token&quot;&gt; &lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #005cc5;&quot;&gt;14&lt;/span&gt;&lt;span class=&quot;token&quot;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;token&quot;&gt;        &lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #22863a;&quot;&gt;n&lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #22863a;&quot;&gt;ame&lt;/span&gt;&lt;span class=&quot;token&quot;&gt;:&lt;/span&gt;&lt;span class=&quot;token&quot;&gt; &lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #032f62;&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #032f62;&quot;&gt;RPI Cooling Fan&lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #032f62;&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span class=&quot;token&quot;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;token&quot;&gt;        &lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #22863a;&quot;&gt;u&lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #22863a;&quot;&gt;nique_id&lt;/span&gt;&lt;span class=&quot;token&quot;&gt;:&lt;/span&gt;&lt;span class=&quot;token&quot;&gt; &lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #032f62;&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #032f62;&quot;&gt;rpi_cooling_fan&lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #032f62;&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span class=&quot;token&quot;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;token&quot;&gt;        
&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;token&quot; style=&quot;color: #22863a;&quot;&gt;c&lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #22863a;&quot;&gt;limate&lt;/span&gt;&lt;span class=&quot;token&quot;&gt;:&lt;/span&gt;&lt;span class=&quot;token&quot;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;token&quot;&gt;  &lt;/span&gt;&lt;span class=&quot;token&quot;&gt;-&lt;/span&gt;&lt;span class=&quot;token&quot;&gt; &lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #22863a;&quot;&gt;p&lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #22863a;&quot;&gt;latform&lt;/span&gt;&lt;span class=&quot;token&quot;&gt;:&lt;/span&gt;&lt;span class=&quot;token&quot;&gt; &lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #032f62;&quot;&gt;g&lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #032f62;&quot;&gt;eneric_thermostat&lt;/span&gt;&lt;span class=&quot;token&quot;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;token&quot;&gt;    &lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #22863a;&quot;&gt;n&lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #22863a;&quot;&gt;ame&lt;/span&gt;&lt;span class=&quot;token&quot;&gt;:&lt;/span&gt;&lt;span class=&quot;token&quot;&gt; &lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #032f62;&quot;&gt;R&lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #032f62;&quot;&gt;PI Cooling Fan Controller&lt;/span&gt;&lt;span class=&quot;token&quot;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;token&quot;&gt;    &lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #22863a;&quot;&gt;u&lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #22863a;&quot;&gt;nique_id&lt;/span&gt;&lt;span class=&quot;token&quot;&gt;:&lt;/span&gt;&lt;span class=&quot;token&quot;&gt; &lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #032f62;&quot;&gt;r&lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #032f62;&quot;&gt;pi_cooling_fan_controller&lt;/span&gt;&lt;span class=&quot;token&quot;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;token&quot;&gt;    &lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #22863a;&quot;&gt;h&lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #22863a;&quot;&gt;eater&lt;/span&gt;&lt;span class=&quot;token&quot;&gt;:&lt;/span&gt;&lt;span class=&quot;token&quot;&gt; &lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #032f62;&quot;&gt;s&lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #032f62;&quot;&gt;witch.rpi_cooling_fan&lt;/span&gt;&lt;span class=&quot;token&quot;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;token&quot;&gt;    &lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #22863a;&quot;&gt;t&lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #22863a;&quot;&gt;arget_sensor&lt;/span&gt;&lt;span class=&quot;token&quot;&gt;:&lt;/span&gt;&lt;span class=&quot;token&quot;&gt; &lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #032f62;&quot;&gt;s&lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #032f62;&quot;&gt;ensor.system_monitor_processor_temperature&lt;/span&gt;&lt;span class=&quot;token&quot;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;token&quot;&gt;    &lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #22863a;&quot;&gt;m&lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #22863a;&quot;&gt;in_temp&lt;/span&gt;&lt;span class=&quot;token&quot;&gt;:&lt;/span&gt;&lt;span class=&quot;token&quot;&gt; &lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #005cc5;&quot;&gt;45&lt;/span&gt;&lt;span class=&quot;token&quot;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;token&quot;&gt;    &lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #22863a;&quot;&gt;m&lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #22863a;&quot;&gt;ax_temp&lt;/span&gt;&lt;span class=&quot;token&quot;&gt;:&lt;/span&gt;&lt;span class=&quot;token&quot;&gt; &lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #005cc5;&quot;&gt;80&lt;/span&gt;&lt;span class=&quot;token&quot;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;token&quot;&gt;    &lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #22863a;&quot;&gt;a&lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #22863a;&quot;&gt;c_mode&lt;/span&gt;&lt;span class=&quot;token&quot;&gt;:&lt;/span&gt;&lt;span class=&quot;token&quot;&gt; &lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #005cc5;&quot;&gt;true&lt;/span&gt;&lt;span class=&quot;token&quot;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;token&quot;&gt;    &lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #22863a;&quot;&gt;t&lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #22863a;&quot;&gt;arget_temp&lt;/span&gt;&lt;span class=&quot;token&quot;&gt;:&lt;/span&gt;&lt;span class=&quot;token&quot;&gt; &lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #005cc5;&quot;&gt;55&lt;/span&gt;&lt;span class=&quot;token&quot;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;token&quot;&gt;    &lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #22863a;&quot;&gt;c&lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #22863a;&quot;&gt;old_tolerance&lt;/span&gt;&lt;span class=&quot;token&quot;&gt;:&lt;/span&gt;&lt;span class=&quot;token&quot;&gt; &lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #005cc5;&quot;&gt;0.5&lt;/span&gt;&lt;span class=&quot;token&quot;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;token&quot;&gt;    &lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #22863a;&quot;&gt;h&lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #22863a;&quot;&gt;ot_tolerance&lt;/span&gt;&lt;span class=&quot;token&quot;&gt;:&lt;/span&gt;&lt;span class=&quot;token&quot;&gt; &lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #005cc5;&quot;&gt;0.5&lt;/span&gt;&lt;span class=&quot;token&quot;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;token&quot;&gt;    &lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #22863a;&quot;&gt;m&lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #22863a;&quot;&gt;in_cycle_duration&lt;/span&gt;&lt;span class=&quot;token&quot;&gt;:&lt;/span&gt;&lt;span class=&quot;token&quot;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;token&quot;&gt;      &lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #22863a;&quot;&gt;s&lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #22863a;&quot;&gt;econds&lt;/span&gt;&lt;span class=&quot;token&quot;&gt;:&lt;/span&gt;&lt;span class=&quot;token&quot;&gt; &lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #005cc5;&quot;&gt;60&lt;/span&gt;&lt;span class=&quot;token&quot;&gt; &lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #6a737d;&quot;&gt;#&lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #6a737d;&quot;&gt; Minimum time the fan should run before turning off&lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #6a737d;&quot;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;token&quot;&gt;    &lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #22863a;&quot;&gt;k&lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #22863a;&quot;&gt;eep_alive&lt;/span&gt;&lt;span class=&quot;token&quot;&gt;:&lt;/span&gt;&lt;span class=&quot;token&quot;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;token&quot;&gt;      &lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #22863a;&quot;&gt;m&lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #22863a;&quot;&gt;inutes&lt;/span&gt;&lt;span class=&quot;token&quot;&gt;:&lt;/span&gt;&lt;span class=&quot;token&quot;&gt; &lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #005cc5;&quot;&gt;5&lt;/span&gt;&lt;span class=&quot;token&quot;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;token&quot;&gt;    &lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #22863a;&quot;&gt;i&lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #22863a;&quot;&gt;nitial_hvac_mode&lt;/span&gt;&lt;span class=&quot;token&quot;&gt;:&lt;/span&gt;&lt;span class=&quot;token&quot;&gt; &lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #032f62;&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #032f62;&quot;&gt;cool&lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #032f62;&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span class=&quot;token&quot;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;This configuration does the following:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Defines a switch for the fan connected to GPIO 14.&lt;/li&gt;
&lt;li&gt;Sets up a generic thermostat that uses the fan as a heater.&lt;/li&gt;
&lt;li&gt;Monitors the CPU temperature using the &lt;code&gt;sensor.system_monitor_processor_temperature&lt;/code&gt; sensor.&lt;/li&gt;
&lt;li&gt;Sets the target temperature to 55°C, with a minimum and maximum temperature range of 45°C and 80°C, respectively.&lt;/li&gt;
&lt;li&gt;Configures the thermostat to run the fan for at least 60 seconds before turning it off, and keeps it alive for 5 minutes after the last activation.&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;&lt;a id=&quot;content-result&quot; href=&quot;#content-result&quot; class=&quot;heading-permalink&quot; aria-hidden=&quot;true&quot; tabindex=&quot;-1&quot; title=&quot;Permalink&quot;&gt;#&lt;/a&gt;Result&lt;/h2&gt;
&lt;p&gt;&lt;img src=&quot;https://assets.srwiez.com/hass-rpi-fan/capture-decran-2025-06-09-a-13.43.30.png&quot; alt=&quot;Card with al the entities&quot; /&gt;&lt;br /&gt;
&lt;img src=&quot;https://assets.srwiez.com/hass-rpi-fan/capture-decran-2025-06-09-a-13.43.40.png&quot; alt=&quot;Card of the thermostat&quot; /&gt;&lt;/p&gt;</content>
        <author>
            <name>Eser DENIZ</name>
        </author>
    </entry>
    <entry>
        <title type="text">How I wasted 3 days upgrading to FluxUI</title>
        <link href="https://srwiez.com/posts/how-i-wasted-3-days-upgrading-to-fluxui"/>
        <id>https://srwiez.com/posts/how-i-wasted-3-days-upgrading-to-fluxui</id>
        <published>2025-03-26T00:00:00+00:00</published>
        <updated>2025-03-27T13:21:17+00:00</updated>
        <summary type="text">&lt;p&gt;I'm sorry for the clickbait title. I actually have only good things to say. I just wanted to catch people commenting before reading the article.&lt;/p&gt;
&lt;p&gt;It &lt;strong&gt;started as a simple PR&lt;/strong&gt;: add &lt;a href=&quot;https://fluxui.dev/?utm_source=srwiez.com&amp;amp;utm_medium=blog&amp;amp;utm_campaign=fluxui-refactor&quot;&gt;FluxUI&lt;/a&gt; to &lt;a href=&quot;https://unolia.com/?utm_source=srwiez.com&amp;amp;utm_medium=blog&amp;amp;utm_campaign=fluxui-refactor&quot;&gt;unolia.com&lt;/a&gt; and upgrade to TailwindCSS v4, and it &lt;strong&gt;ended as a big refactor&lt;/strong&gt; of my project. Let me tell you my journey.&lt;/p&gt;
&lt;!--more--&gt;
&lt;p&gt;I started using FluxUI in other smaller projects, and I got used to it, especially for forms. It felt much cleaner and faster to work with Flux than anything else I had used before.&lt;/p&gt;
&lt;ul class=&quot;table-of-contents not-prose&quot;&gt;
&lt;li&gt;&lt;a href=&quot;#content-before-the-migration&quot;&gt;Before the migration&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;#content-the-big-refactor&quot;&gt;The big refactor&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;#content-whats-next-&quot;&gt;What’s next ?&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;#content-before-and-after-screenshots&quot;&gt;Before and after screenshots&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;#content-conclusion&quot;&gt;Conclusion&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;#content-tldr&quot;&gt;TLDR&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;&lt;a id=&quot;content-before-the-migration&quot; href=&quot;#content-before-the-migration&quot; class=&quot;heading-permalink&quot; aria-hidden=&quot;true&quot; tabindex=&quot;-1&quot; title=&quot;Permalink&quot;&gt;#&lt;/a&gt;Before the migration&lt;/h2&gt;
&lt;p&gt;Unolia.com is based on Jetstream, so most of the input was using &lt;code&gt;&amp;lt;x-input&amp;gt;&lt;/code&gt; syntax shipped with Jetstream. Jetstream has been very convenient for jumpstarting the project, but over time I needed more.&lt;/p&gt;
&lt;p&gt;I bought &lt;a href=&quot;https://tailwindcss.com/plus?utm_source=srwiez.com&amp;amp;utm_medium=blog&amp;amp;utm_campaign=fluxui-refactor&quot;&gt;TailwindPlus&lt;/a&gt; several years ago, and it helped me a lot in making beautiful UIs. The thing is, if you don’t use components, you end up with big, unreadable HTML and inconsistency throughout your app. And if you want different input text with suffixes or prefixes, that means writing a lot of conditional code or duplicating code.&lt;/p&gt;
&lt;p&gt;Anyway, for my case, I didn’t bother that much until now.&lt;/p&gt;
&lt;p&gt;FluxUI is perfect for me. I use Livewire a lot, and it’s so tightly integrated. Design-wise, it is not far from TailwindPlus, although I preferred the dropdown design over it and other small details.&lt;/p&gt;
&lt;h2&gt;&lt;a id=&quot;content-the-big-refactor&quot; href=&quot;#content-the-big-refactor&quot; class=&quot;heading-permalink&quot; aria-hidden=&quot;true&quot; tabindex=&quot;-1&quot; title=&quot;Permalink&quot;&gt;#&lt;/a&gt;The big refactor&lt;/h2&gt;
&lt;p&gt;I began the conversion gradually, starting with a few input replacements.&lt;/p&gt;
&lt;p&gt;Next, I worked on the dropdowns.&lt;/p&gt;
&lt;p&gt;Then I noticed in the documentation that I could support dark mode.&lt;/p&gt;
&lt;p&gt;After that, I lost track of what I was doing.&lt;/p&gt;
&lt;p&gt;I became fully immersed in rewriting everything to enable dark mode support.&lt;/p&gt;
&lt;p&gt;That meant rewriting some Jetstream components, reworking some layouts, some wording, well every detail of my app.&lt;/p&gt;
&lt;p&gt;And the result is beautiful.&lt;/p&gt;
&lt;p&gt;I had some head-scratching moments, especially with the way Jetstream handles its modal and also where Flux doesn't work outside Livewire sometimes.&lt;/p&gt;
&lt;p&gt;I'm grateful to have made time for my robust test suite, especially the end-to-end tests.&lt;/p&gt;
&lt;p&gt;Also, going through all my codebase and retesting my app allowed me to fix a couple of minor bugs or simply improve the experience.&lt;/p&gt;
&lt;h2&gt;&lt;a id=&quot;content-whats-next-&quot; href=&quot;#content-whats-next-&quot; class=&quot;heading-permalink&quot; aria-hidden=&quot;true&quot; tabindex=&quot;-1&quot; title=&quot;Permalink&quot;&gt;#&lt;/a&gt;What’s next ?&lt;/h2&gt;
&lt;p&gt;Now, I want to rewrite everything myself.&lt;/p&gt;
&lt;p&gt;I never liked that Jetstream was a library instead of a starter kit. It's cool at the beggining but then it becomes difficult to personalize.&lt;/p&gt;
&lt;p&gt;I realized that I added those dependencies to kickstart my project for the UI they provide, rather than for their features. I wanted Jetstream for team functionality and Filmant for notifications.&lt;/p&gt;
&lt;p&gt;The same applies to wire-elements/spotlight. I never really used it, which is why I never purchased the pro version either. I had considered it, but after reading the documentation, I realized it wouldn’t fully offer the features I wanted. I believe a command bar needs to be truely well-made to be useful, which is why &lt;a href=&quot;https://www.raycast.com/hey/22bc22a4&quot;&gt;Raycast&lt;/a&gt; is so popular.&lt;/p&gt;
&lt;p&gt;Anyway, I think FluxUI will allow me to create a nice command bar myself.&lt;/p&gt;
&lt;p&gt;Also, some of those packages had versions with strict Livewire version locking (looking at you, Filament), and I didn’t like that because for a while a fix I needed was blocked because of that.&lt;/p&gt;
&lt;p&gt;So I’ll continue removing dependencies from my projects&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;laravel/jetstream&lt;/strong&gt; =&amp;gt; Integrate the logic directely in my app.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;wire-elements/spotlight&lt;/strong&gt; =&amp;gt; FluxUI Command&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;filament/notification&lt;/strong&gt; =&amp;gt; I will probably write my own package that leverages FluxUI (or not), but &lt;a href=&quot;/posts/upgrade-your-filament-notifications-by-live-updating-them&quot;&gt;I already have specific needs &lt;/a&gt;that I'm sure are worth a PR.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;All of this can obviously wait.&lt;/p&gt;
&lt;p&gt;This is the kind of thing that does not even make it to the TODO list.&lt;/p&gt;
&lt;p&gt;I just dive deep into when I feel it.&lt;/p&gt;
&lt;h2&gt;&lt;a id=&quot;content-before-and-after-screenshots&quot; href=&quot;#content-before-and-after-screenshots&quot; class=&quot;heading-permalink&quot; aria-hidden=&quot;true&quot; tabindex=&quot;-1&quot; title=&quot;Permalink&quot;&gt;#&lt;/a&gt;Before and after screenshots&lt;/h2&gt;
&lt;div class=&quot;flex justify-around&quot;&gt;
  &lt;a href=&quot;https://assets.srwiez.com/fluxui-refactor/dashboard-old-2.png&quot; target=&quot;_blank&quot;  style=&quot;width:45%&quot;&gt;
    &lt;img src=&quot;https://assets.srwiez.com/fluxui-refactor/dashboard-old-2.png&quot; /&gt;
  &lt;/a&gt;
  &lt;a href=&quot;https://assets.srwiez.com/fluxui-refactor/dashboard-new-2.png&quot; target=&quot;_blank&quot; style=&quot;width:45%&quot;&gt;
  	&lt;img src=&quot;https://assets.srwiez.com/fluxui-refactor/dashboard-new-2.png&quot; /&gt;
  &lt;/a&gt;
&lt;/div&gt;
&lt;p&gt;From the dashboard, you can see how the header and the navigation are much more balanced than before.&lt;/p&gt;
&lt;div class=&quot;flex justify-around&quot;&gt;
  &lt;a href=&quot;https://assets.srwiez.com/fluxui-refactor/issues-old.png&quot; target=&quot;_blank&quot;  style=&quot;width:45%&quot;&gt;
    &lt;img src=&quot;https://assets.srwiez.com/fluxui-refactor/issues-old.png&quot; /&gt;
  &lt;/a&gt;
  &lt;a href=&quot;https://assets.srwiez.com/fluxui-refactor/issues-new.png&quot; target=&quot;_blank&quot; style=&quot;width:45%&quot;&gt;
  	&lt;img src=&quot;https://assets.srwiez.com/fluxui-refactor/issues-new.png&quot; /&gt;
  &lt;/a&gt;
&lt;/div&gt;
&lt;p&gt;I replaced the filament table with a FluxUI table. It's much easier to personalize.&lt;/p&gt;
&lt;div class=&quot;flex justify-around&quot;&gt;
  &lt;a href=&quot;https://assets.srwiez.com/fluxui-refactor/domain-old.png&quot; target=&quot;_blank&quot;  style=&quot;width:45%&quot;&gt;
    &lt;img src=&quot;https://assets.srwiez.com/fluxui-refactor/domain-old.png&quot; /&gt;
  &lt;/a&gt;
  &lt;a href=&quot;https://assets.srwiez.com/fluxui-refactor/domain-new.png&quot; target=&quot;_blank&quot; style=&quot;width:45%&quot;&gt;
  	&lt;img src=&quot;https://assets.srwiez.com/fluxui-refactor/domain-new.png&quot; /&gt;
  &lt;/a&gt;
&lt;/div&gt;
For the domain: more space, cleaner tabs, button weights revised, record type aligned to the right. Also using the new avatar component for the favicon of the website (future small feature).
&lt;div class=&quot;flex justify-around&quot;&gt;
  &lt;a href=&quot;https://assets.srwiez.com/fluxui-refactor/record-old.png&quot; target=&quot;_blank&quot;  style=&quot;width:45%&quot;&gt;
    &lt;img src=&quot;https://assets.srwiez.com/fluxui-refactor/record-old.png&quot; /&gt;
  &lt;/a&gt;
  &lt;a href=&quot;https://assets.srwiez.com/fluxui-refactor/record-new.png&quot; target=&quot;_blank&quot; style=&quot;width:45%&quot;&gt;
  	&lt;img src=&quot;https://assets.srwiez.com/fluxui-refactor/record-new.png&quot; /&gt;
  &lt;/a&gt;
&lt;/div&gt;
Again, small details, but they help see it clearer. Also, it took me some time to add a dark mode to my custom radio buttons.
&lt;h2&gt;&lt;a id=&quot;content-conclusion&quot; href=&quot;#content-conclusion&quot; class=&quot;heading-permalink&quot; aria-hidden=&quot;true&quot; tabindex=&quot;-1&quot; title=&quot;Permalink&quot;&gt;#&lt;/a&gt;Conclusion&lt;/h2&gt;
&lt;p&gt;So this is how a simple &amp;quot;let’s add flux&amp;quot; turned into &amp;quot;let’s refactor my entire project for no reason.&amp;quot;&lt;/p&gt;
&lt;p&gt;Why this title, though? Because using 3 days of my free time to add 0 value to my customers is arguably a waste of time.&lt;/p&gt;
&lt;p&gt;But &lt;strong&gt;I don’t regret a single minute&lt;/strong&gt;.&lt;/p&gt;
&lt;p&gt;It was great. &lt;a href=&quot;https://unolia.com/?utm_source=srwiez.com&amp;amp;utm_medium=blog&amp;amp;utm_campaign=fluxui-refactor&quot;&gt;unolia.com&lt;/a&gt; has a clearer UI, a better UX, and most importantly, cleaner code.&lt;/p&gt;
&lt;p&gt;I can now focus back on other features.&lt;/p&gt;
&lt;p&gt;To conclude this article and if you like the TALL stack:&lt;/p&gt;
&lt;p&gt;100% recommend FluxUI.&lt;/p&gt;
&lt;h2&gt;&lt;a id=&quot;content-tldr&quot; href=&quot;#content-tldr&quot; class=&quot;heading-permalink&quot; aria-hidden=&quot;true&quot; tabindex=&quot;-1&quot; title=&quot;Permalink&quot;&gt;#&lt;/a&gt;TLDR&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;Refactoring to Flux reduced the number of lines of code in my project while giving me more features.&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://unolia.com/?utm_source=srwiez.com&amp;amp;utm_medium=blog&amp;amp;utm_campaign=fluxui-refactor&quot;&gt;unolia.com&lt;/a&gt; now supports dark mode.&lt;/li&gt;
&lt;li&gt;Jetstream is about to disappear completely from my project. I embrace the new starter kit way.&lt;/li&gt;
&lt;li&gt;Tests are mandatory before rewriting your app. However, tests can’t see everything. Manual tests are still mandatory in some cases.&lt;/li&gt;
&lt;li&gt;Refactoring also means going through all your app and improving every detail of it&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Post scriptum:&lt;/p&gt;
&lt;p&gt;I'm wondering, should I do a dark mode here?&lt;/p&gt;
&lt;p&gt;Nah, I think I have better things to do.&lt;/p&gt;</summary>
        <content type="html">&lt;p&gt;I'm sorry for the clickbait title. I actually have only good things to say. I just wanted to catch people commenting before reading the article.&lt;/p&gt;
&lt;p&gt;It &lt;strong&gt;started as a simple PR&lt;/strong&gt;: add &lt;a href=&quot;https://fluxui.dev/?utm_source=srwiez.com&amp;amp;utm_medium=blog&amp;amp;utm_campaign=fluxui-refactor&quot;&gt;FluxUI&lt;/a&gt; to &lt;a href=&quot;https://unolia.com/?utm_source=srwiez.com&amp;amp;utm_medium=blog&amp;amp;utm_campaign=fluxui-refactor&quot;&gt;unolia.com&lt;/a&gt; and upgrade to TailwindCSS v4, and it &lt;strong&gt;ended as a big refactor&lt;/strong&gt; of my project. Let me tell you my journey.&lt;/p&gt;
&lt;!--more--&gt;
&lt;p&gt;I started using FluxUI in other smaller projects, and I got used to it, especially for forms. It felt much cleaner and faster to work with Flux than anything else I had used before.&lt;/p&gt;
&lt;ul class=&quot;table-of-contents not-prose&quot;&gt;
&lt;li&gt;&lt;a href=&quot;#content-before-the-migration&quot;&gt;Before the migration&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;#content-the-big-refactor&quot;&gt;The big refactor&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;#content-whats-next-&quot;&gt;What’s next ?&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;#content-before-and-after-screenshots&quot;&gt;Before and after screenshots&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;#content-conclusion&quot;&gt;Conclusion&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;#content-tldr&quot;&gt;TLDR&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;&lt;a id=&quot;content-before-the-migration&quot; href=&quot;#content-before-the-migration&quot; class=&quot;heading-permalink&quot; aria-hidden=&quot;true&quot; tabindex=&quot;-1&quot; title=&quot;Permalink&quot;&gt;#&lt;/a&gt;Before the migration&lt;/h2&gt;
&lt;p&gt;Unolia.com is based on Jetstream, so most of the input was using &lt;code&gt;&amp;lt;x-input&amp;gt;&lt;/code&gt; syntax shipped with Jetstream. Jetstream has been very convenient for jumpstarting the project, but over time I needed more.&lt;/p&gt;
&lt;p&gt;I bought &lt;a href=&quot;https://tailwindcss.com/plus?utm_source=srwiez.com&amp;amp;utm_medium=blog&amp;amp;utm_campaign=fluxui-refactor&quot;&gt;TailwindPlus&lt;/a&gt; several years ago, and it helped me a lot in making beautiful UIs. The thing is, if you don’t use components, you end up with big, unreadable HTML and inconsistency throughout your app. And if you want different input text with suffixes or prefixes, that means writing a lot of conditional code or duplicating code.&lt;/p&gt;
&lt;p&gt;Anyway, for my case, I didn’t bother that much until now.&lt;/p&gt;
&lt;p&gt;FluxUI is perfect for me. I use Livewire a lot, and it’s so tightly integrated. Design-wise, it is not far from TailwindPlus, although I preferred the dropdown design over it and other small details.&lt;/p&gt;
&lt;h2&gt;&lt;a id=&quot;content-the-big-refactor&quot; href=&quot;#content-the-big-refactor&quot; class=&quot;heading-permalink&quot; aria-hidden=&quot;true&quot; tabindex=&quot;-1&quot; title=&quot;Permalink&quot;&gt;#&lt;/a&gt;The big refactor&lt;/h2&gt;
&lt;p&gt;I began the conversion gradually, starting with a few input replacements.&lt;/p&gt;
&lt;p&gt;Next, I worked on the dropdowns.&lt;/p&gt;
&lt;p&gt;Then I noticed in the documentation that I could support dark mode.&lt;/p&gt;
&lt;p&gt;After that, I lost track of what I was doing.&lt;/p&gt;
&lt;p&gt;I became fully immersed in rewriting everything to enable dark mode support.&lt;/p&gt;
&lt;p&gt;That meant rewriting some Jetstream components, reworking some layouts, some wording, well every detail of my app.&lt;/p&gt;
&lt;p&gt;And the result is beautiful.&lt;/p&gt;
&lt;p&gt;I had some head-scratching moments, especially with the way Jetstream handles its modal and also where Flux doesn't work outside Livewire sometimes.&lt;/p&gt;
&lt;p&gt;I'm grateful to have made time for my robust test suite, especially the end-to-end tests.&lt;/p&gt;
&lt;p&gt;Also, going through all my codebase and retesting my app allowed me to fix a couple of minor bugs or simply improve the experience.&lt;/p&gt;
&lt;h2&gt;&lt;a id=&quot;content-whats-next-&quot; href=&quot;#content-whats-next-&quot; class=&quot;heading-permalink&quot; aria-hidden=&quot;true&quot; tabindex=&quot;-1&quot; title=&quot;Permalink&quot;&gt;#&lt;/a&gt;What’s next ?&lt;/h2&gt;
&lt;p&gt;Now, I want to rewrite everything myself.&lt;/p&gt;
&lt;p&gt;I never liked that Jetstream was a library instead of a starter kit. It's cool at the beggining but then it becomes difficult to personalize.&lt;/p&gt;
&lt;p&gt;I realized that I added those dependencies to kickstart my project for the UI they provide, rather than for their features. I wanted Jetstream for team functionality and Filmant for notifications.&lt;/p&gt;
&lt;p&gt;The same applies to wire-elements/spotlight. I never really used it, which is why I never purchased the pro version either. I had considered it, but after reading the documentation, I realized it wouldn’t fully offer the features I wanted. I believe a command bar needs to be truely well-made to be useful, which is why &lt;a href=&quot;https://www.raycast.com/hey/22bc22a4&quot;&gt;Raycast&lt;/a&gt; is so popular.&lt;/p&gt;
&lt;p&gt;Anyway, I think FluxUI will allow me to create a nice command bar myself.&lt;/p&gt;
&lt;p&gt;Also, some of those packages had versions with strict Livewire version locking (looking at you, Filament), and I didn’t like that because for a while a fix I needed was blocked because of that.&lt;/p&gt;
&lt;p&gt;So I’ll continue removing dependencies from my projects&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;laravel/jetstream&lt;/strong&gt; =&amp;gt; Integrate the logic directely in my app.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;wire-elements/spotlight&lt;/strong&gt; =&amp;gt; FluxUI Command&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;filament/notification&lt;/strong&gt; =&amp;gt; I will probably write my own package that leverages FluxUI (or not), but &lt;a href=&quot;/posts/upgrade-your-filament-notifications-by-live-updating-them&quot;&gt;I already have specific needs &lt;/a&gt;that I'm sure are worth a PR.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;All of this can obviously wait.&lt;/p&gt;
&lt;p&gt;This is the kind of thing that does not even make it to the TODO list.&lt;/p&gt;
&lt;p&gt;I just dive deep into when I feel it.&lt;/p&gt;
&lt;h2&gt;&lt;a id=&quot;content-before-and-after-screenshots&quot; href=&quot;#content-before-and-after-screenshots&quot; class=&quot;heading-permalink&quot; aria-hidden=&quot;true&quot; tabindex=&quot;-1&quot; title=&quot;Permalink&quot;&gt;#&lt;/a&gt;Before and after screenshots&lt;/h2&gt;
&lt;div class=&quot;flex justify-around&quot;&gt;
  &lt;a href=&quot;https://assets.srwiez.com/fluxui-refactor/dashboard-old-2.png&quot; target=&quot;_blank&quot;  style=&quot;width:45%&quot;&gt;
    &lt;img src=&quot;https://assets.srwiez.com/fluxui-refactor/dashboard-old-2.png&quot; /&gt;
  &lt;/a&gt;
  &lt;a href=&quot;https://assets.srwiez.com/fluxui-refactor/dashboard-new-2.png&quot; target=&quot;_blank&quot; style=&quot;width:45%&quot;&gt;
  	&lt;img src=&quot;https://assets.srwiez.com/fluxui-refactor/dashboard-new-2.png&quot; /&gt;
  &lt;/a&gt;
&lt;/div&gt;
&lt;p&gt;From the dashboard, you can see how the header and the navigation are much more balanced than before.&lt;/p&gt;
&lt;div class=&quot;flex justify-around&quot;&gt;
  &lt;a href=&quot;https://assets.srwiez.com/fluxui-refactor/issues-old.png&quot; target=&quot;_blank&quot;  style=&quot;width:45%&quot;&gt;
    &lt;img src=&quot;https://assets.srwiez.com/fluxui-refactor/issues-old.png&quot; /&gt;
  &lt;/a&gt;
  &lt;a href=&quot;https://assets.srwiez.com/fluxui-refactor/issues-new.png&quot; target=&quot;_blank&quot; style=&quot;width:45%&quot;&gt;
  	&lt;img src=&quot;https://assets.srwiez.com/fluxui-refactor/issues-new.png&quot; /&gt;
  &lt;/a&gt;
&lt;/div&gt;
&lt;p&gt;I replaced the filament table with a FluxUI table. It's much easier to personalize.&lt;/p&gt;
&lt;div class=&quot;flex justify-around&quot;&gt;
  &lt;a href=&quot;https://assets.srwiez.com/fluxui-refactor/domain-old.png&quot; target=&quot;_blank&quot;  style=&quot;width:45%&quot;&gt;
    &lt;img src=&quot;https://assets.srwiez.com/fluxui-refactor/domain-old.png&quot; /&gt;
  &lt;/a&gt;
  &lt;a href=&quot;https://assets.srwiez.com/fluxui-refactor/domain-new.png&quot; target=&quot;_blank&quot; style=&quot;width:45%&quot;&gt;
  	&lt;img src=&quot;https://assets.srwiez.com/fluxui-refactor/domain-new.png&quot; /&gt;
  &lt;/a&gt;
&lt;/div&gt;
For the domain: more space, cleaner tabs, button weights revised, record type aligned to the right. Also using the new avatar component for the favicon of the website (future small feature).
&lt;div class=&quot;flex justify-around&quot;&gt;
  &lt;a href=&quot;https://assets.srwiez.com/fluxui-refactor/record-old.png&quot; target=&quot;_blank&quot;  style=&quot;width:45%&quot;&gt;
    &lt;img src=&quot;https://assets.srwiez.com/fluxui-refactor/record-old.png&quot; /&gt;
  &lt;/a&gt;
  &lt;a href=&quot;https://assets.srwiez.com/fluxui-refactor/record-new.png&quot; target=&quot;_blank&quot; style=&quot;width:45%&quot;&gt;
  	&lt;img src=&quot;https://assets.srwiez.com/fluxui-refactor/record-new.png&quot; /&gt;
  &lt;/a&gt;
&lt;/div&gt;
Again, small details, but they help see it clearer. Also, it took me some time to add a dark mode to my custom radio buttons.
&lt;h2&gt;&lt;a id=&quot;content-conclusion&quot; href=&quot;#content-conclusion&quot; class=&quot;heading-permalink&quot; aria-hidden=&quot;true&quot; tabindex=&quot;-1&quot; title=&quot;Permalink&quot;&gt;#&lt;/a&gt;Conclusion&lt;/h2&gt;
&lt;p&gt;So this is how a simple &amp;quot;let’s add flux&amp;quot; turned into &amp;quot;let’s refactor my entire project for no reason.&amp;quot;&lt;/p&gt;
&lt;p&gt;Why this title, though? Because using 3 days of my free time to add 0 value to my customers is arguably a waste of time.&lt;/p&gt;
&lt;p&gt;But &lt;strong&gt;I don’t regret a single minute&lt;/strong&gt;.&lt;/p&gt;
&lt;p&gt;It was great. &lt;a href=&quot;https://unolia.com/?utm_source=srwiez.com&amp;amp;utm_medium=blog&amp;amp;utm_campaign=fluxui-refactor&quot;&gt;unolia.com&lt;/a&gt; has a clearer UI, a better UX, and most importantly, cleaner code.&lt;/p&gt;
&lt;p&gt;I can now focus back on other features.&lt;/p&gt;
&lt;p&gt;To conclude this article and if you like the TALL stack:&lt;/p&gt;
&lt;p&gt;100% recommend FluxUI.&lt;/p&gt;
&lt;h2&gt;&lt;a id=&quot;content-tldr&quot; href=&quot;#content-tldr&quot; class=&quot;heading-permalink&quot; aria-hidden=&quot;true&quot; tabindex=&quot;-1&quot; title=&quot;Permalink&quot;&gt;#&lt;/a&gt;TLDR&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;Refactoring to Flux reduced the number of lines of code in my project while giving me more features.&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://unolia.com/?utm_source=srwiez.com&amp;amp;utm_medium=blog&amp;amp;utm_campaign=fluxui-refactor&quot;&gt;unolia.com&lt;/a&gt; now supports dark mode.&lt;/li&gt;
&lt;li&gt;Jetstream is about to disappear completely from my project. I embrace the new starter kit way.&lt;/li&gt;
&lt;li&gt;Tests are mandatory before rewriting your app. However, tests can’t see everything. Manual tests are still mandatory in some cases.&lt;/li&gt;
&lt;li&gt;Refactoring also means going through all your app and improving every detail of it&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Post scriptum:&lt;/p&gt;
&lt;p&gt;I'm wondering, should I do a dark mode here?&lt;/p&gt;
&lt;p&gt;Nah, I think I have better things to do.&lt;/p&gt;</content>
        <author>
            <name>Eser DENIZ</name>
        </author>
    </entry>
    <entry>
        <title type="text">Host your own AI Server using Proxmox and Ollama and connect PHPStorm to it</title>
        <link href="https://srwiez.com/posts/host-your-own-ai-server-using-proxmox-and-ollama-and-connect-phpstorm-to-it"/>
        <id>https://srwiez.com/posts/host-your-own-ai-server-using-proxmox-and-ollama-and-connect-phpstorm-to-it</id>
        <published>2025-02-13T00:00:00+00:00</published>
        <updated>2025-02-13T14:30:58+00:00</updated>
        <summary type="text">&lt;p&gt;This is a guide on how to set up an AI server on Proxmox, connect it to PHPStorm, and use Tailscale for remote access.&lt;/p&gt;
&lt;!--more--&gt;  
&lt;p&gt;I have a rather beefy server at home that I use mostly as my Windows gaming machine. It runs Proxmox because, from the beginning, I knew I wanted a server where I could run VMs and containers from a distance.&lt;/p&gt;
&lt;p&gt;You may not know, but I travel a lot with my van, and I can't bring all my equipment with me.&lt;/p&gt;
&lt;p&gt;For context, here are the hardware specs of my server:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;CPU:&lt;/strong&gt; AMD Ryzen 9 5900X 12-Core Processor&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;RAM:&lt;/strong&gt; 32GB (I need to upgrade it to 128GB or something)&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;GPU:&lt;/strong&gt; Nvidia RTX 3070 + Nvidia RTX 3060 Ti&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Storage:&lt;/strong&gt; 2TB NVMe + 2x 60GB SSD&lt;/li&gt;
&lt;/ul&gt;
&lt;ul class=&quot;table-of-contents not-prose&quot;&gt;
&lt;li&gt;&lt;a href=&quot;#content-create-a-new-vm&quot;&gt;Create a new VM&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;#content-install-required-nvidia-cuda-drivers-and-toolkit&quot;&gt;Install required Nvidia CUDA Drivers and Toolkit&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;#content-docker-installation&quot;&gt;Docker Installation&lt;/a&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;#content-install-nvidia-container-toolkit&quot;&gt;Install Nvidia Container Toolkit&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;#content-use-ollama-for-running-ai-models&quot;&gt;Use Ollama for running AI models&lt;/a&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;#content-basic-usage-of-ollama&quot;&gt;Basic Usage of Ollama&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;#content-make-ollama-listen-outside-of-localhost&quot;&gt;Make Ollama listen outside of localhost&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;#content-openwebui-installation&quot;&gt;OpenWebUI Installation&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;#content-tailscale&quot;&gt;Tailscale&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;#content-phpstorm-integration&quot;&gt;PHPStorm Integration&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;#content-update-ollama-and-openwebui&quot;&gt;Update Ollama and OpenWebUI&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;#content-conclusion&quot;&gt;Conclusion&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;&lt;a id=&quot;content-create-a-new-vm&quot; href=&quot;#content-create-a-new-vm&quot; class=&quot;heading-permalink&quot; aria-hidden=&quot;true&quot; tabindex=&quot;-1&quot; title=&quot;Permalink&quot;&gt;#&lt;/a&gt;Create a new VM&lt;/h2&gt;
&lt;p&gt;We begin by setting up an Ubuntu VM on Proxmox, allocating the necessary resources for your AI server. You can download an ISO and create a new VM from it with the console, but I prefer to use a script to automate the process.&lt;/p&gt;
&lt;p&gt;The script comes from the &lt;a href=&quot;https://community-scripts.github.io/ProxmoxVE/&quot;&gt;community-scripts&lt;/a&gt; repository, and it's a simple bash script that you can run on your Proxmox server.&lt;/p&gt;
&lt;p&gt;Run the following script to deploy the Ubuntu VM:&lt;/p&gt;
&lt;div x-data=&quot;codeBlock&quot; class=&quot;code-block relative&quot;&gt;&lt;div class=&quot;flex space-x-2 items-center absolute top-0 right-0&quot;&gt;
    &lt;div x-cloak x-show=&quot;showMessage&quot; x-transition class=&quot;py-2 animate-bounce transition duration-300 mt-1 text-sky-500 text-xs&quot;&gt;Copied!&lt;/div&gt;
    &lt;button
        type=&quot;button&quot;
        title=&quot;Copy to clipboard&quot;
        class=&quot;hidden sm:block p-2 pl-3 transition duration-300&quot;
        @click.prevent=&quot;copyToClipboard&quot;
        :class=&quot;{
            'text-black/30 hover:text-black/80': !showMessage,
            'text-sky-500 hover:text-sky-700': showMessage,
        }&quot;&gt;
        &lt;svg xmlns=&quot;http://www.w3.org/2000/svg&quot; fill=&quot;none&quot; viewBox=&quot;0 0 24 24&quot; stroke-width=&quot;1.5&quot; stroke=&quot;currentColor&quot; class=&quot;block w-6 h-6&quot;&gt;
            &lt;path fill=&quot;white&quot; stroke-linecap=&quot;round&quot; stroke-linejoin=&quot;round&quot; d=&quot;M11.35 3.836c-.065.21-.1.433-.1.664 0 .414.336.75.75.75h4.5a.75.75 0 00.75-.75 2.25 2.25 0 00-.1-.664m-5.8 0A2.251 2.251 0 0113.5 2.25H15c1.012 0 1.867.668 2.15 1.586m-5.8 0c-.376.023-.75.05-1.124.08C9.095 4.01 8.25 4.973 8.25 6.108V8.25m8.9-4.414c.376.023.75.05 1.124.08 1.131.094 1.976 1.057 1.976 2.192V16.5A2.25 2.25 0 0118 18.75h-2.25m-7.5-10.5H4.875c-.621 0-1.125.504-1.125 1.125v11.25c0 .621.504 1.125 1.125 1.125h9.75c.621 0 1.125-.504 1.125-1.125V18.75m-7.5-10.5h6.375c.621 0 1.125.504 1.125 1.125v9.375m-8.25-3l1.5 1.5 3-3.75&quot; /&gt;
        &lt;/svg&gt;
    &lt;/button&gt;
&lt;/div&gt;&lt;pre class=&quot;phiki language-shellscript github-light&quot; data-language=&quot;shellscript&quot; style=&quot;background-color: #fff;color: #24292e;&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;token&quot; style=&quot;color: #6f42c1;&quot;&gt;bash&lt;/span&gt;&lt;span class=&quot;token&quot;&gt; &lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #005cc5;&quot;&gt;-&lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #005cc5;&quot;&gt;c&lt;/span&gt;&lt;span class=&quot;token&quot;&gt; &lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #032f62;&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #032f62;&quot;&gt;$(&lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #6f42c1;&quot;&gt;wget&lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #032f62;&quot;&gt; &lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #005cc5;&quot;&gt;-&lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #005cc5;&quot;&gt;qLO&lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #032f62;&quot;&gt; &lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #032f62;&quot;&gt;-&lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #032f62;&quot;&gt; [Proxmox&lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #032f62;&quot;&gt; &lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #032f62;&quot;&gt;script]&lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #032f62;&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #6f42c1;&quot;&gt;https://github.com/community-scripts/ProxmoxVE/raw/main/vm/ubuntu2404-vm.sh&lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #032f62;&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #032f62;&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #032f62;&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span class=&quot;token&quot;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;The script will ask you for some information; here is what I used:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;I allocated &lt;strong&gt;512 Go&lt;/strong&gt; storage because LLVM models are huge.&lt;/li&gt;
&lt;li&gt;I gave it &lt;strong&gt;24 576 MB&lt;/strong&gt; RAM. I tried with 32 GB, but it made my server crash. Keep some RAM for the host. Ollama is great at distributing the load on the CPU and GPUs. This gives me plenty of room to test large models.&lt;/li&gt;
&lt;li&gt;Do not start the VM immediately after installation.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;After the installation is finished, in the &lt;strong&gt;Cloud-Init&lt;/strong&gt; tab:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Configure the user &lt;code&gt;user&lt;/code&gt;, set a password, and/or add your public SSH key.&lt;/li&gt;
&lt;li&gt;I chose to use DHCP for the network configuration because I will only access it from my Tailscale network.&lt;/li&gt;
&lt;li&gt;Click on &lt;strong&gt;Regenerate image&lt;/strong&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Before starting the VM, go to the &lt;strong&gt;Hardware&lt;/strong&gt; tab and add your GPU to the VM.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Add&lt;/strong&gt; -&amp;gt; &lt;strong&gt;PCI Device&lt;/strong&gt; -&amp;gt; &lt;strong&gt;Raw Device&lt;/strong&gt; -&amp;gt; &lt;strong&gt;Your GPU&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;Check &lt;strong&gt;All functions&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;In the advanced options, check &lt;strong&gt;ROM-Bar&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Start&lt;/strong&gt; the VM.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;After that, you have a fresh Ubuntu VM ready to be used.&lt;/p&gt;
&lt;p&gt;I took some time to install ZSH and Oh-My-Zsh, but do as you wish.&lt;/p&gt;
&lt;h2&gt;&lt;a id=&quot;content-install-required-nvidia-cuda-drivers-and-toolkit&quot; href=&quot;#content-install-required-nvidia-cuda-drivers-and-toolkit&quot; class=&quot;heading-permalink&quot; aria-hidden=&quot;true&quot; tabindex=&quot;-1&quot; title=&quot;Permalink&quot;&gt;#&lt;/a&gt;Install required Nvidia CUDA Drivers and Toolkit&lt;/h2&gt;
&lt;p&gt;Now it's time to configure this server to work well with AI models.&lt;/p&gt;
&lt;p&gt;Start by confirming that your GPU is detected with:&lt;/p&gt;
&lt;div x-data=&quot;codeBlock&quot; class=&quot;code-block relative&quot;&gt;&lt;div class=&quot;flex space-x-2 items-center absolute top-0 right-0&quot;&gt;
    &lt;div x-cloak x-show=&quot;showMessage&quot; x-transition class=&quot;py-2 animate-bounce transition duration-300 mt-1 text-sky-500 text-xs&quot;&gt;Copied!&lt;/div&gt;
    &lt;button
        type=&quot;button&quot;
        title=&quot;Copy to clipboard&quot;
        class=&quot;hidden sm:block p-2 pl-3 transition duration-300&quot;
        @click.prevent=&quot;copyToClipboard&quot;
        :class=&quot;{
            'text-black/30 hover:text-black/80': !showMessage,
            'text-sky-500 hover:text-sky-700': showMessage,
        }&quot;&gt;
        &lt;svg xmlns=&quot;http://www.w3.org/2000/svg&quot; fill=&quot;none&quot; viewBox=&quot;0 0 24 24&quot; stroke-width=&quot;1.5&quot; stroke=&quot;currentColor&quot; class=&quot;block w-6 h-6&quot;&gt;
            &lt;path fill=&quot;white&quot; stroke-linecap=&quot;round&quot; stroke-linejoin=&quot;round&quot; d=&quot;M11.35 3.836c-.065.21-.1.433-.1.664 0 .414.336.75.75.75h4.5a.75.75 0 00.75-.75 2.25 2.25 0 00-.1-.664m-5.8 0A2.251 2.251 0 0113.5 2.25H15c1.012 0 1.867.668 2.15 1.586m-5.8 0c-.376.023-.75.05-1.124.08C9.095 4.01 8.25 4.973 8.25 6.108V8.25m8.9-4.414c.376.023.75.05 1.124.08 1.131.094 1.976 1.057 1.976 2.192V16.5A2.25 2.25 0 0118 18.75h-2.25m-7.5-10.5H4.875c-.621 0-1.125.504-1.125 1.125v11.25c0 .621.504 1.125 1.125 1.125h9.75c.621 0 1.125-.504 1.125-1.125V18.75m-7.5-10.5h6.375c.621 0 1.125.504 1.125 1.125v9.375m-8.25-3l1.5 1.5 3-3.75&quot; /&gt;
        &lt;/svg&gt;
    &lt;/button&gt;
&lt;/div&gt;&lt;pre class=&quot;phiki language-shellscript github-light&quot; data-language=&quot;shellscript&quot; style=&quot;background-color: #fff;color: #24292e;&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;token&quot; style=&quot;color: #6f42c1;&quot;&gt;lspci&lt;/span&gt;&lt;span class=&quot;token&quot;&gt; &lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #d73a49;&quot;&gt;|&lt;/span&gt;&lt;span class=&quot;token&quot;&gt; &lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #6f42c1;&quot;&gt;grep&lt;/span&gt;&lt;span class=&quot;token&quot;&gt; &lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #005cc5;&quot;&gt;-&lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #005cc5;&quot;&gt;i&lt;/span&gt;&lt;span class=&quot;token&quot;&gt; &lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #032f62;&quot;&gt;nvidia&lt;/span&gt;&lt;span class=&quot;token&quot;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;Now we need to install Nvidia's CUDA Toolkit and drivers.&lt;br /&gt;
The instructions for your machine can be found here &lt;a href=&quot;https://developer.nvidia.com/cuda-downloads?target_os=Linux&amp;amp;target_arch=x86_64&amp;amp;Distribution=Ubuntu&amp;amp;target_version=24.04&amp;amp;target_type=deb_network&quot;&gt;CUDA downloads page&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;For our Ubuntu 24.04, we will use the following commands:&lt;/p&gt;
&lt;div x-data=&quot;codeBlock&quot; class=&quot;code-block relative&quot;&gt;&lt;div class=&quot;flex space-x-2 items-center absolute top-0 right-0&quot;&gt;
    &lt;div x-cloak x-show=&quot;showMessage&quot; x-transition class=&quot;py-2 animate-bounce transition duration-300 mt-1 text-sky-500 text-xs&quot;&gt;Copied!&lt;/div&gt;
    &lt;button
        type=&quot;button&quot;
        title=&quot;Copy to clipboard&quot;
        class=&quot;hidden sm:block p-2 pl-3 transition duration-300&quot;
        @click.prevent=&quot;copyToClipboard&quot;
        :class=&quot;{
            'text-black/30 hover:text-black/80': !showMessage,
            'text-sky-500 hover:text-sky-700': showMessage,
        }&quot;&gt;
        &lt;svg xmlns=&quot;http://www.w3.org/2000/svg&quot; fill=&quot;none&quot; viewBox=&quot;0 0 24 24&quot; stroke-width=&quot;1.5&quot; stroke=&quot;currentColor&quot; class=&quot;block w-6 h-6&quot;&gt;
            &lt;path fill=&quot;white&quot; stroke-linecap=&quot;round&quot; stroke-linejoin=&quot;round&quot; d=&quot;M11.35 3.836c-.065.21-.1.433-.1.664 0 .414.336.75.75.75h4.5a.75.75 0 00.75-.75 2.25 2.25 0 00-.1-.664m-5.8 0A2.251 2.251 0 0113.5 2.25H15c1.012 0 1.867.668 2.15 1.586m-5.8 0c-.376.023-.75.05-1.124.08C9.095 4.01 8.25 4.973 8.25 6.108V8.25m8.9-4.414c.376.023.75.05 1.124.08 1.131.094 1.976 1.057 1.976 2.192V16.5A2.25 2.25 0 0118 18.75h-2.25m-7.5-10.5H4.875c-.621 0-1.125.504-1.125 1.125v11.25c0 .621.504 1.125 1.125 1.125h9.75c.621 0 1.125-.504 1.125-1.125V18.75m-7.5-10.5h6.375c.621 0 1.125.504 1.125 1.125v9.375m-8.25-3l1.5 1.5 3-3.75&quot; /&gt;
        &lt;/svg&gt;
    &lt;/button&gt;
&lt;/div&gt;&lt;pre class=&quot;phiki language-shellscript github-light&quot; data-language=&quot;shellscript&quot; style=&quot;background-color: #fff;color: #24292e;&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;token&quot; style=&quot;color: #6f42c1;&quot;&gt;wget&lt;/span&gt;&lt;span class=&quot;token&quot;&gt; &lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #032f62;&quot;&gt;https://developer.download.nvidia.com/compute/cuda/repos/ubuntu2404/x86_64/cuda-keyring_1.1-1_all.deb&lt;/span&gt;&lt;span class=&quot;token&quot;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;token&quot; style=&quot;color: #6f42c1;&quot;&gt;sudo&lt;/span&gt;&lt;span class=&quot;token&quot;&gt; &lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #032f62;&quot;&gt;dpkg&lt;/span&gt;&lt;span class=&quot;token&quot;&gt; &lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #005cc5;&quot;&gt;-&lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #005cc5;&quot;&gt;i&lt;/span&gt;&lt;span class=&quot;token&quot;&gt; &lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #032f62;&quot;&gt;cuda-keyring_1.1-1_all.deb&lt;/span&gt;&lt;span class=&quot;token&quot;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;token&quot; style=&quot;color: #6f42c1;&quot;&gt;sudo&lt;/span&gt;&lt;span class=&quot;token&quot;&gt; &lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #032f62;&quot;&gt;apt-get&lt;/span&gt;&lt;span class=&quot;token&quot;&gt; &lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #032f62;&quot;&gt;update&lt;/span&gt;&lt;span class=&quot;token&quot;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;token&quot; style=&quot;color: #6f42c1;&quot;&gt;sudo&lt;/span&gt;&lt;span class=&quot;token&quot;&gt; &lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #032f62;&quot;&gt;apt-get&lt;/span&gt;&lt;span class=&quot;token&quot;&gt; &lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #005cc5;&quot;&gt;-&lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #005cc5;&quot;&gt;y&lt;/span&gt;&lt;span class=&quot;token&quot;&gt; &lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #032f62;&quot;&gt;install&lt;/span&gt;&lt;span class=&quot;token&quot;&gt; &lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #032f62;&quot;&gt;cuda-toolkit-12-8&lt;/span&gt;&lt;span class=&quot;token&quot;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;token&quot; style=&quot;color: #6f42c1;&quot;&gt;sudo&lt;/span&gt;&lt;span class=&quot;token&quot;&gt; &lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #032f62;&quot;&gt;apt-get&lt;/span&gt;&lt;span class=&quot;token&quot;&gt; &lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #032f62;&quot;&gt;install&lt;/span&gt;&lt;span class=&quot;token&quot;&gt; &lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #005cc5;&quot;&gt;-&lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #005cc5;&quot;&gt;y&lt;/span&gt;&lt;span class=&quot;token&quot;&gt; &lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #032f62;&quot;&gt;cuda-drivers&lt;/span&gt;&lt;span class=&quot;token&quot;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;Now we need to reboot the server to apply the changes:&lt;/p&gt;
&lt;div x-data=&quot;codeBlock&quot; class=&quot;code-block relative&quot;&gt;&lt;div class=&quot;flex space-x-2 items-center absolute top-0 right-0&quot;&gt;
    &lt;div x-cloak x-show=&quot;showMessage&quot; x-transition class=&quot;py-2 animate-bounce transition duration-300 mt-1 text-sky-500 text-xs&quot;&gt;Copied!&lt;/div&gt;
    &lt;button
        type=&quot;button&quot;
        title=&quot;Copy to clipboard&quot;
        class=&quot;hidden sm:block p-2 pl-3 transition duration-300&quot;
        @click.prevent=&quot;copyToClipboard&quot;
        :class=&quot;{
            'text-black/30 hover:text-black/80': !showMessage,
            'text-sky-500 hover:text-sky-700': showMessage,
        }&quot;&gt;
        &lt;svg xmlns=&quot;http://www.w3.org/2000/svg&quot; fill=&quot;none&quot; viewBox=&quot;0 0 24 24&quot; stroke-width=&quot;1.5&quot; stroke=&quot;currentColor&quot; class=&quot;block w-6 h-6&quot;&gt;
            &lt;path fill=&quot;white&quot; stroke-linecap=&quot;round&quot; stroke-linejoin=&quot;round&quot; d=&quot;M11.35 3.836c-.065.21-.1.433-.1.664 0 .414.336.75.75.75h4.5a.75.75 0 00.75-.75 2.25 2.25 0 00-.1-.664m-5.8 0A2.251 2.251 0 0113.5 2.25H15c1.012 0 1.867.668 2.15 1.586m-5.8 0c-.376.023-.75.05-1.124.08C9.095 4.01 8.25 4.973 8.25 6.108V8.25m8.9-4.414c.376.023.75.05 1.124.08 1.131.094 1.976 1.057 1.976 2.192V16.5A2.25 2.25 0 0118 18.75h-2.25m-7.5-10.5H4.875c-.621 0-1.125.504-1.125 1.125v11.25c0 .621.504 1.125 1.125 1.125h9.75c.621 0 1.125-.504 1.125-1.125V18.75m-7.5-10.5h6.375c.621 0 1.125.504 1.125 1.125v9.375m-8.25-3l1.5 1.5 3-3.75&quot; /&gt;
        &lt;/svg&gt;
    &lt;/button&gt;
&lt;/div&gt;&lt;pre class=&quot;phiki language-shellscript github-light&quot; data-language=&quot;shellscript&quot; style=&quot;background-color: #fff;color: #24292e;&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;token&quot; style=&quot;color: #6f42c1;&quot;&gt;sudo&lt;/span&gt;&lt;span class=&quot;token&quot;&gt; &lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #032f62;&quot;&gt;reboot&lt;/span&gt;&lt;span class=&quot;token&quot;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;Set the environment variables:&lt;/p&gt;
&lt;div x-data=&quot;codeBlock&quot; class=&quot;code-block relative&quot;&gt;&lt;div class=&quot;flex space-x-2 items-center absolute top-0 right-0&quot;&gt;
    &lt;div x-cloak x-show=&quot;showMessage&quot; x-transition class=&quot;py-2 animate-bounce transition duration-300 mt-1 text-sky-500 text-xs&quot;&gt;Copied!&lt;/div&gt;
    &lt;button
        type=&quot;button&quot;
        title=&quot;Copy to clipboard&quot;
        class=&quot;hidden sm:block p-2 pl-3 transition duration-300&quot;
        @click.prevent=&quot;copyToClipboard&quot;
        :class=&quot;{
            'text-black/30 hover:text-black/80': !showMessage,
            'text-sky-500 hover:text-sky-700': showMessage,
        }&quot;&gt;
        &lt;svg xmlns=&quot;http://www.w3.org/2000/svg&quot; fill=&quot;none&quot; viewBox=&quot;0 0 24 24&quot; stroke-width=&quot;1.5&quot; stroke=&quot;currentColor&quot; class=&quot;block w-6 h-6&quot;&gt;
            &lt;path fill=&quot;white&quot; stroke-linecap=&quot;round&quot; stroke-linejoin=&quot;round&quot; d=&quot;M11.35 3.836c-.065.21-.1.433-.1.664 0 .414.336.75.75.75h4.5a.75.75 0 00.75-.75 2.25 2.25 0 00-.1-.664m-5.8 0A2.251 2.251 0 0113.5 2.25H15c1.012 0 1.867.668 2.15 1.586m-5.8 0c-.376.023-.75.05-1.124.08C9.095 4.01 8.25 4.973 8.25 6.108V8.25m8.9-4.414c.376.023.75.05 1.124.08 1.131.094 1.976 1.057 1.976 2.192V16.5A2.25 2.25 0 0118 18.75h-2.25m-7.5-10.5H4.875c-.621 0-1.125.504-1.125 1.125v11.25c0 .621.504 1.125 1.125 1.125h9.75c.621 0 1.125-.504 1.125-1.125V18.75m-7.5-10.5h6.375c.621 0 1.125.504 1.125 1.125v9.375m-8.25-3l1.5 1.5 3-3.75&quot; /&gt;
        &lt;/svg&gt;
    &lt;/button&gt;
&lt;/div&gt;&lt;pre class=&quot;phiki language-shellscript github-light&quot; data-language=&quot;shellscript&quot; style=&quot;background-color: #fff;color: #24292e;&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;token&quot; style=&quot;color: #d73a49;&quot;&gt;export&lt;/span&gt;&lt;span class=&quot;token&quot;&gt; &lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #24292e;&quot;&gt;PATH&lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #d73a49;&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;token&quot;&gt;/&lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #24292e;&quot;&gt;usr&lt;/span&gt;&lt;span class=&quot;token&quot;&gt;/&lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #24292e;&quot;&gt;local&lt;/span&gt;&lt;span class=&quot;token&quot;&gt;/&lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #24292e;&quot;&gt;cuda-12&lt;/span&gt;&lt;span class=&quot;token&quot;&gt;/&lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #24292e;&quot;&gt;bin&lt;/span&gt;&lt;span class=&quot;token&quot;&gt;$&lt;/span&gt;&lt;span class=&quot;token&quot;&gt;{&lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #24292e;&quot;&gt;PATH&lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #d73a49;&quot;&gt;:&lt;/span&gt;&lt;span class=&quot;token&quot;&gt;+&lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #d73a49;&quot;&gt;:&lt;/span&gt;&lt;span class=&quot;token&quot;&gt;$&lt;/span&gt;&lt;span class=&quot;token&quot;&gt;{&lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #24292e;&quot;&gt;PATH&lt;/span&gt;&lt;span class=&quot;token&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;token&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;token&quot;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;token&quot; style=&quot;color: #d73a49;&quot;&gt;export&lt;/span&gt;&lt;span class=&quot;token&quot;&gt; &lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #24292e;&quot;&gt;LD_LIBRARY_PATH&lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #d73a49;&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;token&quot;&gt;/&lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #24292e;&quot;&gt;usr&lt;/span&gt;&lt;span class=&quot;token&quot;&gt;/&lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #24292e;&quot;&gt;local&lt;/span&gt;&lt;span class=&quot;token&quot;&gt;/&lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #24292e;&quot;&gt;cuda&lt;/span&gt;&lt;span class=&quot;token&quot;&gt;/&lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #24292e;&quot;&gt;lib&lt;/span&gt;&lt;span class=&quot;token&quot;&gt;$&lt;/span&gt;&lt;span class=&quot;token&quot;&gt;{&lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #24292e;&quot;&gt;LD_LIBRARY_PATH&lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #d73a49;&quot;&gt;:&lt;/span&gt;&lt;span class=&quot;token&quot;&gt;+&lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #d73a49;&quot;&gt;:&lt;/span&gt;&lt;span class=&quot;token&quot;&gt;$&lt;/span&gt;&lt;span class=&quot;token&quot;&gt;{&lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #24292e;&quot;&gt;LD_LIBRARY_PATH&lt;/span&gt;&lt;span class=&quot;token&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;token&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;token&quot;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;And verify the installation:&lt;/p&gt;
&lt;div x-data=&quot;codeBlock&quot; class=&quot;code-block relative&quot;&gt;&lt;div class=&quot;flex space-x-2 items-center absolute top-0 right-0&quot;&gt;
    &lt;div x-cloak x-show=&quot;showMessage&quot; x-transition class=&quot;py-2 animate-bounce transition duration-300 mt-1 text-sky-500 text-xs&quot;&gt;Copied!&lt;/div&gt;
    &lt;button
        type=&quot;button&quot;
        title=&quot;Copy to clipboard&quot;
        class=&quot;hidden sm:block p-2 pl-3 transition duration-300&quot;
        @click.prevent=&quot;copyToClipboard&quot;
        :class=&quot;{
            'text-black/30 hover:text-black/80': !showMessage,
            'text-sky-500 hover:text-sky-700': showMessage,
        }&quot;&gt;
        &lt;svg xmlns=&quot;http://www.w3.org/2000/svg&quot; fill=&quot;none&quot; viewBox=&quot;0 0 24 24&quot; stroke-width=&quot;1.5&quot; stroke=&quot;currentColor&quot; class=&quot;block w-6 h-6&quot;&gt;
            &lt;path fill=&quot;white&quot; stroke-linecap=&quot;round&quot; stroke-linejoin=&quot;round&quot; d=&quot;M11.35 3.836c-.065.21-.1.433-.1.664 0 .414.336.75.75.75h4.5a.75.75 0 00.75-.75 2.25 2.25 0 00-.1-.664m-5.8 0A2.251 2.251 0 0113.5 2.25H15c1.012 0 1.867.668 2.15 1.586m-5.8 0c-.376.023-.75.05-1.124.08C9.095 4.01 8.25 4.973 8.25 6.108V8.25m8.9-4.414c.376.023.75.05 1.124.08 1.131.094 1.976 1.057 1.976 2.192V16.5A2.25 2.25 0 0118 18.75h-2.25m-7.5-10.5H4.875c-.621 0-1.125.504-1.125 1.125v11.25c0 .621.504 1.125 1.125 1.125h9.75c.621 0 1.125-.504 1.125-1.125V18.75m-7.5-10.5h6.375c.621 0 1.125.504 1.125 1.125v9.375m-8.25-3l1.5 1.5 3-3.75&quot; /&gt;
        &lt;/svg&gt;
    &lt;/button&gt;
&lt;/div&gt;&lt;pre class=&quot;phiki language-shellscript github-light&quot; data-language=&quot;shellscript&quot; style=&quot;background-color: #fff;color: #24292e;&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;token&quot; style=&quot;color: #6f42c1;&quot;&gt;nvcc&lt;/span&gt;&lt;span class=&quot;token&quot;&gt; &lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #005cc5;&quot;&gt;-&lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #005cc5;&quot;&gt;-version&lt;/span&gt;&lt;span class=&quot;token&quot;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;token&quot; style=&quot;color: #6f42c1;&quot;&gt;nvidia-smi&lt;/span&gt;&lt;span class=&quot;token&quot;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;That last command shows the GPU usage and the CUDA version.&lt;/p&gt;
&lt;p&gt;Later you can watch it live with:&lt;/p&gt;
&lt;div x-data=&quot;codeBlock&quot; class=&quot;code-block relative&quot;&gt;&lt;div class=&quot;flex space-x-2 items-center absolute top-0 right-0&quot;&gt;
    &lt;div x-cloak x-show=&quot;showMessage&quot; x-transition class=&quot;py-2 animate-bounce transition duration-300 mt-1 text-sky-500 text-xs&quot;&gt;Copied!&lt;/div&gt;
    &lt;button
        type=&quot;button&quot;
        title=&quot;Copy to clipboard&quot;
        class=&quot;hidden sm:block p-2 pl-3 transition duration-300&quot;
        @click.prevent=&quot;copyToClipboard&quot;
        :class=&quot;{
            'text-black/30 hover:text-black/80': !showMessage,
            'text-sky-500 hover:text-sky-700': showMessage,
        }&quot;&gt;
        &lt;svg xmlns=&quot;http://www.w3.org/2000/svg&quot; fill=&quot;none&quot; viewBox=&quot;0 0 24 24&quot; stroke-width=&quot;1.5&quot; stroke=&quot;currentColor&quot; class=&quot;block w-6 h-6&quot;&gt;
            &lt;path fill=&quot;white&quot; stroke-linecap=&quot;round&quot; stroke-linejoin=&quot;round&quot; d=&quot;M11.35 3.836c-.065.21-.1.433-.1.664 0 .414.336.75.75.75h4.5a.75.75 0 00.75-.75 2.25 2.25 0 00-.1-.664m-5.8 0A2.251 2.251 0 0113.5 2.25H15c1.012 0 1.867.668 2.15 1.586m-5.8 0c-.376.023-.75.05-1.124.08C9.095 4.01 8.25 4.973 8.25 6.108V8.25m8.9-4.414c.376.023.75.05 1.124.08 1.131.094 1.976 1.057 1.976 2.192V16.5A2.25 2.25 0 0118 18.75h-2.25m-7.5-10.5H4.875c-.621 0-1.125.504-1.125 1.125v11.25c0 .621.504 1.125 1.125 1.125h9.75c.621 0 1.125-.504 1.125-1.125V18.75m-7.5-10.5h6.375c.621 0 1.125.504 1.125 1.125v9.375m-8.25-3l1.5 1.5 3-3.75&quot; /&gt;
        &lt;/svg&gt;
    &lt;/button&gt;
&lt;/div&gt;&lt;pre class=&quot;phiki language-shellscript github-light&quot; data-language=&quot;shellscript&quot; style=&quot;background-color: #fff;color: #24292e;&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;token&quot; style=&quot;color: #6f42c1;&quot;&gt;watch&lt;/span&gt;&lt;span class=&quot;token&quot;&gt; &lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #005cc5;&quot;&gt;-&lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #005cc5;&quot;&gt;n&lt;/span&gt;&lt;span class=&quot;token&quot;&gt; &lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #005cc5;&quot;&gt;0.5&lt;/span&gt;&lt;span class=&quot;token&quot;&gt; &lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #032f62;&quot;&gt;nvidia-smi&lt;/span&gt;&lt;span class=&quot;token&quot;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;There is also a command called &lt;code&gt;nvtop&lt;/code&gt; that you can install with:&lt;/p&gt;
&lt;div x-data=&quot;codeBlock&quot; class=&quot;code-block relative&quot;&gt;&lt;div class=&quot;flex space-x-2 items-center absolute top-0 right-0&quot;&gt;
    &lt;div x-cloak x-show=&quot;showMessage&quot; x-transition class=&quot;py-2 animate-bounce transition duration-300 mt-1 text-sky-500 text-xs&quot;&gt;Copied!&lt;/div&gt;
    &lt;button
        type=&quot;button&quot;
        title=&quot;Copy to clipboard&quot;
        class=&quot;hidden sm:block p-2 pl-3 transition duration-300&quot;
        @click.prevent=&quot;copyToClipboard&quot;
        :class=&quot;{
            'text-black/30 hover:text-black/80': !showMessage,
            'text-sky-500 hover:text-sky-700': showMessage,
        }&quot;&gt;
        &lt;svg xmlns=&quot;http://www.w3.org/2000/svg&quot; fill=&quot;none&quot; viewBox=&quot;0 0 24 24&quot; stroke-width=&quot;1.5&quot; stroke=&quot;currentColor&quot; class=&quot;block w-6 h-6&quot;&gt;
            &lt;path fill=&quot;white&quot; stroke-linecap=&quot;round&quot; stroke-linejoin=&quot;round&quot; d=&quot;M11.35 3.836c-.065.21-.1.433-.1.664 0 .414.336.75.75.75h4.5a.75.75 0 00.75-.75 2.25 2.25 0 00-.1-.664m-5.8 0A2.251 2.251 0 0113.5 2.25H15c1.012 0 1.867.668 2.15 1.586m-5.8 0c-.376.023-.75.05-1.124.08C9.095 4.01 8.25 4.973 8.25 6.108V8.25m8.9-4.414c.376.023.75.05 1.124.08 1.131.094 1.976 1.057 1.976 2.192V16.5A2.25 2.25 0 0118 18.75h-2.25m-7.5-10.5H4.875c-.621 0-1.125.504-1.125 1.125v11.25c0 .621.504 1.125 1.125 1.125h9.75c.621 0 1.125-.504 1.125-1.125V18.75m-7.5-10.5h6.375c.621 0 1.125.504 1.125 1.125v9.375m-8.25-3l1.5 1.5 3-3.75&quot; /&gt;
        &lt;/svg&gt;
    &lt;/button&gt;
&lt;/div&gt;&lt;pre class=&quot;phiki language-shellscript github-light&quot; data-language=&quot;shellscript&quot; style=&quot;background-color: #fff;color: #24292e;&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;token&quot; style=&quot;color: #6f42c1;&quot;&gt;sudo&lt;/span&gt;&lt;span class=&quot;token&quot;&gt; &lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #032f62;&quot;&gt;apt-get&lt;/span&gt;&lt;span class=&quot;token&quot;&gt; &lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #032f62;&quot;&gt;install&lt;/span&gt;&lt;span class=&quot;token&quot;&gt; &lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #032f62;&quot;&gt;nvtop&lt;/span&gt;&lt;span class=&quot;token&quot;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;h2&gt;&lt;a id=&quot;content-docker-installation&quot; href=&quot;#content-docker-installation&quot; class=&quot;heading-permalink&quot; aria-hidden=&quot;true&quot; tabindex=&quot;-1&quot; title=&quot;Permalink&quot;&gt;#&lt;/a&gt;Docker Installation&lt;/h2&gt;
&lt;p&gt;For some software that we will use, we need to install Docker.&lt;/p&gt;
&lt;p&gt;Follow the steps detailed in the &lt;a href=&quot;https://docs.docker.com/engine/install/ubuntu/&quot;&gt;Docker installation guide&lt;/a&gt;:&lt;/p&gt;
&lt;p&gt;or copy and paste the following commands:&lt;/p&gt;
&lt;div x-data=&quot;codeBlock&quot; class=&quot;code-block relative&quot;&gt;&lt;div class=&quot;flex space-x-2 items-center absolute top-0 right-0&quot;&gt;
    &lt;div x-cloak x-show=&quot;showMessage&quot; x-transition class=&quot;py-2 animate-bounce transition duration-300 mt-1 text-sky-500 text-xs&quot;&gt;Copied!&lt;/div&gt;
    &lt;button
        type=&quot;button&quot;
        title=&quot;Copy to clipboard&quot;
        class=&quot;hidden sm:block p-2 pl-3 transition duration-300&quot;
        @click.prevent=&quot;copyToClipboard&quot;
        :class=&quot;{
            'text-black/30 hover:text-black/80': !showMessage,
            'text-sky-500 hover:text-sky-700': showMessage,
        }&quot;&gt;
        &lt;svg xmlns=&quot;http://www.w3.org/2000/svg&quot; fill=&quot;none&quot; viewBox=&quot;0 0 24 24&quot; stroke-width=&quot;1.5&quot; stroke=&quot;currentColor&quot; class=&quot;block w-6 h-6&quot;&gt;
            &lt;path fill=&quot;white&quot; stroke-linecap=&quot;round&quot; stroke-linejoin=&quot;round&quot; d=&quot;M11.35 3.836c-.065.21-.1.433-.1.664 0 .414.336.75.75.75h4.5a.75.75 0 00.75-.75 2.25 2.25 0 00-.1-.664m-5.8 0A2.251 2.251 0 0113.5 2.25H15c1.012 0 1.867.668 2.15 1.586m-5.8 0c-.376.023-.75.05-1.124.08C9.095 4.01 8.25 4.973 8.25 6.108V8.25m8.9-4.414c.376.023.75.05 1.124.08 1.131.094 1.976 1.057 1.976 2.192V16.5A2.25 2.25 0 0118 18.75h-2.25m-7.5-10.5H4.875c-.621 0-1.125.504-1.125 1.125v11.25c0 .621.504 1.125 1.125 1.125h9.75c.621 0 1.125-.504 1.125-1.125V18.75m-7.5-10.5h6.375c.621 0 1.125.504 1.125 1.125v9.375m-8.25-3l1.5 1.5 3-3.75&quot; /&gt;
        &lt;/svg&gt;
    &lt;/button&gt;
&lt;/div&gt;&lt;pre class=&quot;phiki language-shellscript github-light&quot; data-language=&quot;shellscript&quot; style=&quot;background-color: #fff;color: #24292e;&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;token&quot; style=&quot;color: #6a737d;&quot;&gt;#&lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #6a737d;&quot;&gt; Add Docker&amp;#039;s official GPG key:
&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;token&quot; style=&quot;color: #6f42c1;&quot;&gt;sudo&lt;/span&gt;&lt;span class=&quot;token&quot;&gt; &lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #032f62;&quot;&gt;apt-get&lt;/span&gt;&lt;span class=&quot;token&quot;&gt; &lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #032f62;&quot;&gt;update&lt;/span&gt;&lt;span class=&quot;token&quot;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;token&quot; style=&quot;color: #6f42c1;&quot;&gt;sudo&lt;/span&gt;&lt;span class=&quot;token&quot;&gt; &lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #032f62;&quot;&gt;apt-get&lt;/span&gt;&lt;span class=&quot;token&quot;&gt; &lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #032f62;&quot;&gt;install&lt;/span&gt;&lt;span class=&quot;token&quot;&gt; &lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #032f62;&quot;&gt;ca-certificates&lt;/span&gt;&lt;span class=&quot;token&quot;&gt; &lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #032f62;&quot;&gt;curl&lt;/span&gt;&lt;span class=&quot;token&quot;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;token&quot; style=&quot;color: #6f42c1;&quot;&gt;sudo&lt;/span&gt;&lt;span class=&quot;token&quot;&gt; &lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #032f62;&quot;&gt;install&lt;/span&gt;&lt;span class=&quot;token&quot;&gt; &lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #005cc5;&quot;&gt;-&lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #005cc5;&quot;&gt;m&lt;/span&gt;&lt;span class=&quot;token&quot;&gt; &lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #005cc5;&quot;&gt;0755&lt;/span&gt;&lt;span class=&quot;token&quot;&gt; &lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #005cc5;&quot;&gt;-&lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #005cc5;&quot;&gt;d&lt;/span&gt;&lt;span class=&quot;token&quot;&gt; &lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #032f62;&quot;&gt;/etc/apt/keyrings&lt;/span&gt;&lt;span class=&quot;token&quot;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;token&quot; style=&quot;color: #6f42c1;&quot;&gt;sudo&lt;/span&gt;&lt;span class=&quot;token&quot;&gt; &lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #032f62;&quot;&gt;curl&lt;/span&gt;&lt;span class=&quot;token&quot;&gt; &lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #005cc5;&quot;&gt;-&lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #005cc5;&quot;&gt;fsSL&lt;/span&gt;&lt;span class=&quot;token&quot;&gt; &lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #032f62;&quot;&gt;https://download.docker.com/linux/ubuntu/gpg&lt;/span&gt;&lt;span class=&quot;token&quot;&gt; &lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #005cc5;&quot;&gt;-&lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #005cc5;&quot;&gt;o&lt;/span&gt;&lt;span class=&quot;token&quot;&gt; &lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #032f62;&quot;&gt;/etc/apt/keyrings/docker.asc&lt;/span&gt;&lt;span class=&quot;token&quot;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;token&quot; style=&quot;color: #6f42c1;&quot;&gt;sudo&lt;/span&gt;&lt;span class=&quot;token&quot;&gt; &lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #032f62;&quot;&gt;chmod&lt;/span&gt;&lt;span class=&quot;token&quot;&gt; &lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #032f62;&quot;&gt;a+r&lt;/span&gt;&lt;span class=&quot;token&quot;&gt; &lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #032f62;&quot;&gt;/etc/apt/keyrings/docker.asc&lt;/span&gt;&lt;span class=&quot;token&quot;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;token&quot;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;token&quot; style=&quot;color: #6a737d;&quot;&gt;#&lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #6a737d;&quot;&gt; Add the repository to Apt sources:
&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;token&quot; style=&quot;color: #005cc5;&quot;&gt;echo&lt;/span&gt;&lt;span class=&quot;token&quot;&gt; &lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #005cc5;&quot;&gt;\
&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;token&quot; style=&quot;color: #032f62;&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #032f62;&quot;&gt;deb [arch=&lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #032f62;&quot;&gt;$(&lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #6f42c1;&quot;&gt;dpkg&lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #032f62;&quot;&gt; &lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #005cc5;&quot;&gt;-&lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #005cc5;&quot;&gt;-print-architecture&lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #032f62;&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #032f62;&quot;&gt; signed-by=/etc/apt/keyrings/docker.asc] https://download.docker.com/linux/ubuntu &lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #005cc5;&quot;&gt;\
&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;token&quot; style=&quot;color: #032f62;&quot;&gt;$(&lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #005cc5;&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #032f62;&quot;&gt; &lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #032f62;&quot;&gt;/etc/os-release&lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #032f62;&quot;&gt; &lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #032f62;&quot;&gt;&amp;amp;&amp;amp;&lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #032f62;&quot;&gt; &lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #005cc5;&quot;&gt;echo&lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #032f62;&quot;&gt; &lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #032f62;&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #032f62;&quot;&gt;$&lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #032f62;&quot;&gt;{&lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #24292e;&quot;&gt;UBUNTU_CODENAME&lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #d73a49;&quot;&gt;:-&lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #24292e;&quot;&gt;$&lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #24292e;&quot;&gt;VERSION_CODENAME&lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #032f62;&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #032f62;&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #032f62;&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #032f62;&quot;&gt; stable&lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #032f62;&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span class=&quot;token&quot;&gt; &lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #d73a49;&quot;&gt;|&lt;/span&gt;&lt;span class=&quot;token&quot;&gt; &lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #005cc5;&quot;&gt;\&lt;/span&gt;&lt;span class=&quot;token&quot;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;token&quot; style=&quot;color: #6f42c1;&quot;&gt;sudo&lt;/span&gt;&lt;span class=&quot;token&quot;&gt; &lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #032f62;&quot;&gt;tee&lt;/span&gt;&lt;span class=&quot;token&quot;&gt; &lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #032f62;&quot;&gt;/etc/apt/sources.list.d/docker.list&lt;/span&gt;&lt;span class=&quot;token&quot;&gt; &lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #d73a49;&quot;&gt;&amp;gt;&lt;/span&gt;&lt;span class=&quot;token&quot;&gt; &lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #032f62;&quot;&gt;/dev/null&lt;/span&gt;&lt;span class=&quot;token&quot;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;token&quot; style=&quot;color: #6f42c1;&quot;&gt;sudo&lt;/span&gt;&lt;span class=&quot;token&quot;&gt; &lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #032f62;&quot;&gt;apt-get&lt;/span&gt;&lt;span class=&quot;token&quot;&gt; &lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #032f62;&quot;&gt;update&lt;/span&gt;&lt;span class=&quot;token&quot;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;token&quot;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;token&quot; style=&quot;color: #6a737d;&quot;&gt;#&lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #6a737d;&quot;&gt; Install Docker
&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;token&quot; style=&quot;color: #6f42c1;&quot;&gt;sudo&lt;/span&gt;&lt;span class=&quot;token&quot;&gt; &lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #032f62;&quot;&gt;apt-get&lt;/span&gt;&lt;span class=&quot;token&quot;&gt; &lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #032f62;&quot;&gt;install&lt;/span&gt;&lt;span class=&quot;token&quot;&gt; &lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #032f62;&quot;&gt;docker-ce&lt;/span&gt;&lt;span class=&quot;token&quot;&gt; &lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #032f62;&quot;&gt;docker-ce-cli&lt;/span&gt;&lt;span class=&quot;token&quot;&gt; &lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #032f62;&quot;&gt;containerd.io&lt;/span&gt;&lt;span class=&quot;token&quot;&gt; &lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #032f62;&quot;&gt;docker-buildx-plugin&lt;/span&gt;&lt;span class=&quot;token&quot;&gt; &lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #032f62;&quot;&gt;docker-compose-plugin&lt;/span&gt;&lt;span class=&quot;token&quot;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;Confirm the installation by running:&lt;/p&gt;
&lt;div x-data=&quot;codeBlock&quot; class=&quot;code-block relative&quot;&gt;&lt;div class=&quot;flex space-x-2 items-center absolute top-0 right-0&quot;&gt;
    &lt;div x-cloak x-show=&quot;showMessage&quot; x-transition class=&quot;py-2 animate-bounce transition duration-300 mt-1 text-sky-500 text-xs&quot;&gt;Copied!&lt;/div&gt;
    &lt;button
        type=&quot;button&quot;
        title=&quot;Copy to clipboard&quot;
        class=&quot;hidden sm:block p-2 pl-3 transition duration-300&quot;
        @click.prevent=&quot;copyToClipboard&quot;
        :class=&quot;{
            'text-black/30 hover:text-black/80': !showMessage,
            'text-sky-500 hover:text-sky-700': showMessage,
        }&quot;&gt;
        &lt;svg xmlns=&quot;http://www.w3.org/2000/svg&quot; fill=&quot;none&quot; viewBox=&quot;0 0 24 24&quot; stroke-width=&quot;1.5&quot; stroke=&quot;currentColor&quot; class=&quot;block w-6 h-6&quot;&gt;
            &lt;path fill=&quot;white&quot; stroke-linecap=&quot;round&quot; stroke-linejoin=&quot;round&quot; d=&quot;M11.35 3.836c-.065.21-.1.433-.1.664 0 .414.336.75.75.75h4.5a.75.75 0 00.75-.75 2.25 2.25 0 00-.1-.664m-5.8 0A2.251 2.251 0 0113.5 2.25H15c1.012 0 1.867.668 2.15 1.586m-5.8 0c-.376.023-.75.05-1.124.08C9.095 4.01 8.25 4.973 8.25 6.108V8.25m8.9-4.414c.376.023.75.05 1.124.08 1.131.094 1.976 1.057 1.976 2.192V16.5A2.25 2.25 0 0118 18.75h-2.25m-7.5-10.5H4.875c-.621 0-1.125.504-1.125 1.125v11.25c0 .621.504 1.125 1.125 1.125h9.75c.621 0 1.125-.504 1.125-1.125V18.75m-7.5-10.5h6.375c.621 0 1.125.504 1.125 1.125v9.375m-8.25-3l1.5 1.5 3-3.75&quot; /&gt;
        &lt;/svg&gt;
    &lt;/button&gt;
&lt;/div&gt;&lt;pre class=&quot;phiki language-shellscript github-light&quot; data-language=&quot;shellscript&quot; style=&quot;background-color: #fff;color: #24292e;&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;token&quot; style=&quot;color: #6f42c1;&quot;&gt;sudo&lt;/span&gt;&lt;span class=&quot;token&quot;&gt; &lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #032f62;&quot;&gt;docker&lt;/span&gt;&lt;span class=&quot;token&quot;&gt; &lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #032f62;&quot;&gt;run&lt;/span&gt;&lt;span class=&quot;token&quot;&gt; &lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #032f62;&quot;&gt;hello-world&lt;/span&gt;&lt;span class=&quot;token&quot;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;h3&gt;&lt;a id=&quot;content-install-nvidia-container-toolkit&quot; href=&quot;#content-install-nvidia-container-toolkit&quot; class=&quot;heading-permalink&quot; aria-hidden=&quot;true&quot; tabindex=&quot;-1&quot; title=&quot;Permalink&quot;&gt;#&lt;/a&gt;Install Nvidia Container Toolkit&lt;/h3&gt;
&lt;p&gt;I don't use Ollama in a Docker container, but you may want to. Or maybe you need to run some other containers that need access to the GPU. This section ensures that you can use the GPU in a container in the future.&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;https://docs.nvidia.com/datacenter/cloud-native/container-toolkit/latest/install-guide.html&quot;&gt;Nvidia container toolkit documentation&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;Follow the instructions for your distribution.&lt;/p&gt;
&lt;h2&gt;&lt;a id=&quot;content-use-ollama-for-running-ai-models&quot; href=&quot;#content-use-ollama-for-running-ai-models&quot; class=&quot;heading-permalink&quot; aria-hidden=&quot;true&quot; tabindex=&quot;-1&quot; title=&quot;Permalink&quot;&gt;#&lt;/a&gt;Use Ollama for running AI models&lt;/h2&gt;
&lt;p&gt;Ollama is a powerful tool for running AI models on your server. It provides a simple command-line interface to run various AI models with ease.&lt;/p&gt;
&lt;p&gt;It also comes with an API that can be used by other applications.&lt;/p&gt;
&lt;p&gt;One feature that I like is that it can distribute the load on multiple GPUs and CPUs. I tried to run models that only use GPU; the rule of thumb is to use models that can fit in the combined memory of all GPUs.&lt;/p&gt;
&lt;p&gt;This is our true AI server.&lt;/p&gt;
&lt;p&gt;I decided to install Ollama directly on the VM, but you can also use a Docker container.&lt;/p&gt;
&lt;p&gt;Install Ollama with the provided script:&lt;/p&gt;
&lt;div x-data=&quot;codeBlock&quot; class=&quot;code-block relative&quot;&gt;&lt;div class=&quot;flex space-x-2 items-center absolute top-0 right-0&quot;&gt;
    &lt;div x-cloak x-show=&quot;showMessage&quot; x-transition class=&quot;py-2 animate-bounce transition duration-300 mt-1 text-sky-500 text-xs&quot;&gt;Copied!&lt;/div&gt;
    &lt;button
        type=&quot;button&quot;
        title=&quot;Copy to clipboard&quot;
        class=&quot;hidden sm:block p-2 pl-3 transition duration-300&quot;
        @click.prevent=&quot;copyToClipboard&quot;
        :class=&quot;{
            'text-black/30 hover:text-black/80': !showMessage,
            'text-sky-500 hover:text-sky-700': showMessage,
        }&quot;&gt;
        &lt;svg xmlns=&quot;http://www.w3.org/2000/svg&quot; fill=&quot;none&quot; viewBox=&quot;0 0 24 24&quot; stroke-width=&quot;1.5&quot; stroke=&quot;currentColor&quot; class=&quot;block w-6 h-6&quot;&gt;
            &lt;path fill=&quot;white&quot; stroke-linecap=&quot;round&quot; stroke-linejoin=&quot;round&quot; d=&quot;M11.35 3.836c-.065.21-.1.433-.1.664 0 .414.336.75.75.75h4.5a.75.75 0 00.75-.75 2.25 2.25 0 00-.1-.664m-5.8 0A2.251 2.251 0 0113.5 2.25H15c1.012 0 1.867.668 2.15 1.586m-5.8 0c-.376.023-.75.05-1.124.08C9.095 4.01 8.25 4.973 8.25 6.108V8.25m8.9-4.414c.376.023.75.05 1.124.08 1.131.094 1.976 1.057 1.976 2.192V16.5A2.25 2.25 0 0118 18.75h-2.25m-7.5-10.5H4.875c-.621 0-1.125.504-1.125 1.125v11.25c0 .621.504 1.125 1.125 1.125h9.75c.621 0 1.125-.504 1.125-1.125V18.75m-7.5-10.5h6.375c.621 0 1.125.504 1.125 1.125v9.375m-8.25-3l1.5 1.5 3-3.75&quot; /&gt;
        &lt;/svg&gt;
    &lt;/button&gt;
&lt;/div&gt;&lt;pre class=&quot;phiki language-shellscript github-light&quot; data-language=&quot;shellscript&quot; style=&quot;background-color: #fff;color: #24292e;&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;token&quot; style=&quot;color: #6f42c1;&quot;&gt;curl&lt;/span&gt;&lt;span class=&quot;token&quot;&gt; &lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #005cc5;&quot;&gt;-&lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #005cc5;&quot;&gt;fsSL&lt;/span&gt;&lt;span class=&quot;token&quot;&gt; &lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #032f62;&quot;&gt;https://ollama.com/install.sh&lt;/span&gt;&lt;span class=&quot;token&quot;&gt; &lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #d73a49;&quot;&gt;|&lt;/span&gt;&lt;span class=&quot;token&quot;&gt; &lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #6f42c1;&quot;&gt;sh&lt;/span&gt;&lt;span class=&quot;token&quot;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;h3&gt;&lt;a id=&quot;content-basic-usage-of-ollama&quot; href=&quot;#content-basic-usage-of-ollama&quot; class=&quot;heading-permalink&quot; aria-hidden=&quot;true&quot; tabindex=&quot;-1&quot; title=&quot;Permalink&quot;&gt;#&lt;/a&gt;Basic Usage of Ollama&lt;/h3&gt;
&lt;p&gt;Run various AI models with commands such as:&lt;/p&gt;
&lt;div x-data=&quot;codeBlock&quot; class=&quot;code-block relative&quot;&gt;&lt;div class=&quot;flex space-x-2 items-center absolute top-0 right-0&quot;&gt;
    &lt;div x-cloak x-show=&quot;showMessage&quot; x-transition class=&quot;py-2 animate-bounce transition duration-300 mt-1 text-sky-500 text-xs&quot;&gt;Copied!&lt;/div&gt;
    &lt;button
        type=&quot;button&quot;
        title=&quot;Copy to clipboard&quot;
        class=&quot;hidden sm:block p-2 pl-3 transition duration-300&quot;
        @click.prevent=&quot;copyToClipboard&quot;
        :class=&quot;{
            'text-black/30 hover:text-black/80': !showMessage,
            'text-sky-500 hover:text-sky-700': showMessage,
        }&quot;&gt;
        &lt;svg xmlns=&quot;http://www.w3.org/2000/svg&quot; fill=&quot;none&quot; viewBox=&quot;0 0 24 24&quot; stroke-width=&quot;1.5&quot; stroke=&quot;currentColor&quot; class=&quot;block w-6 h-6&quot;&gt;
            &lt;path fill=&quot;white&quot; stroke-linecap=&quot;round&quot; stroke-linejoin=&quot;round&quot; d=&quot;M11.35 3.836c-.065.21-.1.433-.1.664 0 .414.336.75.75.75h4.5a.75.75 0 00.75-.75 2.25 2.25 0 00-.1-.664m-5.8 0A2.251 2.251 0 0113.5 2.25H15c1.012 0 1.867.668 2.15 1.586m-5.8 0c-.376.023-.75.05-1.124.08C9.095 4.01 8.25 4.973 8.25 6.108V8.25m8.9-4.414c.376.023.75.05 1.124.08 1.131.094 1.976 1.057 1.976 2.192V16.5A2.25 2.25 0 0118 18.75h-2.25m-7.5-10.5H4.875c-.621 0-1.125.504-1.125 1.125v11.25c0 .621.504 1.125 1.125 1.125h9.75c.621 0 1.125-.504 1.125-1.125V18.75m-7.5-10.5h6.375c.621 0 1.125.504 1.125 1.125v9.375m-8.25-3l1.5 1.5 3-3.75&quot; /&gt;
        &lt;/svg&gt;
    &lt;/button&gt;
&lt;/div&gt;&lt;pre class=&quot;phiki language-shellscript github-light&quot; data-language=&quot;shellscript&quot; style=&quot;background-color: #fff;color: #24292e;&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;token&quot; style=&quot;color: #6f42c1;&quot;&gt;ollama&lt;/span&gt;&lt;span class=&quot;token&quot;&gt; &lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #032f62;&quot;&gt;run&lt;/span&gt;&lt;span class=&quot;token&quot;&gt; &lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #032f62;&quot;&gt;llama3.2&lt;/span&gt;&lt;span class=&quot;token&quot;&gt; &lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #005cc5;&quot;&gt;-&lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #005cc5;&quot;&gt;-verbose&lt;/span&gt;&lt;span class=&quot;token&quot;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;token&quot; style=&quot;color: #6f42c1;&quot;&gt;ollama&lt;/span&gt;&lt;span class=&quot;token&quot;&gt; &lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #032f62;&quot;&gt;run&lt;/span&gt;&lt;span class=&quot;token&quot;&gt; &lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #032f62;&quot;&gt;deepseek-r1:14b&lt;/span&gt;&lt;span class=&quot;token&quot;&gt; &lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #005cc5;&quot;&gt;-&lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #005cc5;&quot;&gt;-verbose&lt;/span&gt;&lt;span class=&quot;token&quot;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;token&quot; style=&quot;color: #6f42c1;&quot;&gt;ollama&lt;/span&gt;&lt;span class=&quot;token&quot;&gt; &lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #032f62;&quot;&gt;run&lt;/span&gt;&lt;span class=&quot;token&quot;&gt; &lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #032f62;&quot;&gt;deepseek-r1:8b&lt;/span&gt;&lt;span class=&quot;token&quot;&gt; &lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #005cc5;&quot;&gt;-&lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #005cc5;&quot;&gt;-verbose&lt;/span&gt;&lt;span class=&quot;token&quot;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;I like to use the &lt;code&gt;--verbose&lt;/code&gt; flag to see stats like &lt;code&gt;tokens per second&lt;/code&gt; and &lt;code&gt;samples per second&lt;/code&gt; after every answer.&lt;/p&gt;
&lt;p&gt;You can also just pull the models without running them:&lt;/p&gt;
&lt;div x-data=&quot;codeBlock&quot; class=&quot;code-block relative&quot;&gt;&lt;div class=&quot;flex space-x-2 items-center absolute top-0 right-0&quot;&gt;
    &lt;div x-cloak x-show=&quot;showMessage&quot; x-transition class=&quot;py-2 animate-bounce transition duration-300 mt-1 text-sky-500 text-xs&quot;&gt;Copied!&lt;/div&gt;
    &lt;button
        type=&quot;button&quot;
        title=&quot;Copy to clipboard&quot;
        class=&quot;hidden sm:block p-2 pl-3 transition duration-300&quot;
        @click.prevent=&quot;copyToClipboard&quot;
        :class=&quot;{
            'text-black/30 hover:text-black/80': !showMessage,
            'text-sky-500 hover:text-sky-700': showMessage,
        }&quot;&gt;
        &lt;svg xmlns=&quot;http://www.w3.org/2000/svg&quot; fill=&quot;none&quot; viewBox=&quot;0 0 24 24&quot; stroke-width=&quot;1.5&quot; stroke=&quot;currentColor&quot; class=&quot;block w-6 h-6&quot;&gt;
            &lt;path fill=&quot;white&quot; stroke-linecap=&quot;round&quot; stroke-linejoin=&quot;round&quot; d=&quot;M11.35 3.836c-.065.21-.1.433-.1.664 0 .414.336.75.75.75h4.5a.75.75 0 00.75-.75 2.25 2.25 0 00-.1-.664m-5.8 0A2.251 2.251 0 0113.5 2.25H15c1.012 0 1.867.668 2.15 1.586m-5.8 0c-.376.023-.75.05-1.124.08C9.095 4.01 8.25 4.973 8.25 6.108V8.25m8.9-4.414c.376.023.75.05 1.124.08 1.131.094 1.976 1.057 1.976 2.192V16.5A2.25 2.25 0 0118 18.75h-2.25m-7.5-10.5H4.875c-.621 0-1.125.504-1.125 1.125v11.25c0 .621.504 1.125 1.125 1.125h9.75c.621 0 1.125-.504 1.125-1.125V18.75m-7.5-10.5h6.375c.621 0 1.125.504 1.125 1.125v9.375m-8.25-3l1.5 1.5 3-3.75&quot; /&gt;
        &lt;/svg&gt;
    &lt;/button&gt;
&lt;/div&gt;&lt;pre class=&quot;phiki language-shellscript github-light&quot; data-language=&quot;shellscript&quot; style=&quot;background-color: #fff;color: #24292e;&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;token&quot; style=&quot;color: #6f42c1;&quot;&gt;ollama&lt;/span&gt;&lt;span class=&quot;token&quot;&gt; &lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #032f62;&quot;&gt;pull&lt;/span&gt;&lt;span class=&quot;token&quot;&gt; &lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #032f62;&quot;&gt;mistral&lt;/span&gt;&lt;span class=&quot;token&quot;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;You can also see how the load is distributed on the GPUs and CPUs with:&lt;/p&gt;
&lt;div x-data=&quot;codeBlock&quot; class=&quot;code-block relative&quot;&gt;&lt;div class=&quot;flex space-x-2 items-center absolute top-0 right-0&quot;&gt;
    &lt;div x-cloak x-show=&quot;showMessage&quot; x-transition class=&quot;py-2 animate-bounce transition duration-300 mt-1 text-sky-500 text-xs&quot;&gt;Copied!&lt;/div&gt;
    &lt;button
        type=&quot;button&quot;
        title=&quot;Copy to clipboard&quot;
        class=&quot;hidden sm:block p-2 pl-3 transition duration-300&quot;
        @click.prevent=&quot;copyToClipboard&quot;
        :class=&quot;{
            'text-black/30 hover:text-black/80': !showMessage,
            'text-sky-500 hover:text-sky-700': showMessage,
        }&quot;&gt;
        &lt;svg xmlns=&quot;http://www.w3.org/2000/svg&quot; fill=&quot;none&quot; viewBox=&quot;0 0 24 24&quot; stroke-width=&quot;1.5&quot; stroke=&quot;currentColor&quot; class=&quot;block w-6 h-6&quot;&gt;
            &lt;path fill=&quot;white&quot; stroke-linecap=&quot;round&quot; stroke-linejoin=&quot;round&quot; d=&quot;M11.35 3.836c-.065.21-.1.433-.1.664 0 .414.336.75.75.75h4.5a.75.75 0 00.75-.75 2.25 2.25 0 00-.1-.664m-5.8 0A2.251 2.251 0 0113.5 2.25H15c1.012 0 1.867.668 2.15 1.586m-5.8 0c-.376.023-.75.05-1.124.08C9.095 4.01 8.25 4.973 8.25 6.108V8.25m8.9-4.414c.376.023.75.05 1.124.08 1.131.094 1.976 1.057 1.976 2.192V16.5A2.25 2.25 0 0118 18.75h-2.25m-7.5-10.5H4.875c-.621 0-1.125.504-1.125 1.125v11.25c0 .621.504 1.125 1.125 1.125h9.75c.621 0 1.125-.504 1.125-1.125V18.75m-7.5-10.5h6.375c.621 0 1.125.504 1.125 1.125v9.375m-8.25-3l1.5 1.5 3-3.75&quot; /&gt;
        &lt;/svg&gt;
    &lt;/button&gt;
&lt;/div&gt;&lt;pre class=&quot;phiki language-shellscript github-light&quot; data-language=&quot;shellscript&quot; style=&quot;background-color: #fff;color: #24292e;&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;token&quot; style=&quot;color: #6f42c1;&quot;&gt;ollama&lt;/span&gt;&lt;span class=&quot;token&quot;&gt; &lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #032f62;&quot;&gt;ps&lt;/span&gt;&lt;span class=&quot;token&quot;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;h3&gt;&lt;a id=&quot;content-make-ollama-listen-outside-of-localhost&quot; href=&quot;#content-make-ollama-listen-outside-of-localhost&quot; class=&quot;heading-permalink&quot; aria-hidden=&quot;true&quot; tabindex=&quot;-1&quot; title=&quot;Permalink&quot;&gt;#&lt;/a&gt;Make Ollama listen outside of localhost&lt;/h3&gt;
&lt;p&gt;This step will be useful if we want our PHPStorm to connect to Ollama.&lt;/p&gt;
&lt;div x-data=&quot;codeBlock&quot; class=&quot;code-block relative&quot;&gt;&lt;div class=&quot;flex space-x-2 items-center absolute top-0 right-0&quot;&gt;
    &lt;div x-cloak x-show=&quot;showMessage&quot; x-transition class=&quot;py-2 animate-bounce transition duration-300 mt-1 text-sky-500 text-xs&quot;&gt;Copied!&lt;/div&gt;
    &lt;button
        type=&quot;button&quot;
        title=&quot;Copy to clipboard&quot;
        class=&quot;hidden sm:block p-2 pl-3 transition duration-300&quot;
        @click.prevent=&quot;copyToClipboard&quot;
        :class=&quot;{
            'text-black/30 hover:text-black/80': !showMessage,
            'text-sky-500 hover:text-sky-700': showMessage,
        }&quot;&gt;
        &lt;svg xmlns=&quot;http://www.w3.org/2000/svg&quot; fill=&quot;none&quot; viewBox=&quot;0 0 24 24&quot; stroke-width=&quot;1.5&quot; stroke=&quot;currentColor&quot; class=&quot;block w-6 h-6&quot;&gt;
            &lt;path fill=&quot;white&quot; stroke-linecap=&quot;round&quot; stroke-linejoin=&quot;round&quot; d=&quot;M11.35 3.836c-.065.21-.1.433-.1.664 0 .414.336.75.75.75h4.5a.75.75 0 00.75-.75 2.25 2.25 0 00-.1-.664m-5.8 0A2.251 2.251 0 0113.5 2.25H15c1.012 0 1.867.668 2.15 1.586m-5.8 0c-.376.023-.75.05-1.124.08C9.095 4.01 8.25 4.973 8.25 6.108V8.25m8.9-4.414c.376.023.75.05 1.124.08 1.131.094 1.976 1.057 1.976 2.192V16.5A2.25 2.25 0 0118 18.75h-2.25m-7.5-10.5H4.875c-.621 0-1.125.504-1.125 1.125v11.25c0 .621.504 1.125 1.125 1.125h9.75c.621 0 1.125-.504 1.125-1.125V18.75m-7.5-10.5h6.375c.621 0 1.125.504 1.125 1.125v9.375m-8.25-3l1.5 1.5 3-3.75&quot; /&gt;
        &lt;/svg&gt;
    &lt;/button&gt;
&lt;/div&gt;&lt;pre class=&quot;phiki language-shellscript github-light&quot; data-language=&quot;shellscript&quot; style=&quot;background-color: #fff;color: #24292e;&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;token&quot; style=&quot;color: #6f42c1;&quot;&gt;systemctl&lt;/span&gt;&lt;span class=&quot;token&quot;&gt; &lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #032f62;&quot;&gt;edit&lt;/span&gt;&lt;span class=&quot;token&quot;&gt; &lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #032f62;&quot;&gt;ollama.service&lt;/span&gt;&lt;span class=&quot;token&quot;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;Add the following lines at the beginning of the file:&lt;/p&gt;
&lt;div x-data=&quot;codeBlock&quot; class=&quot;code-block relative&quot;&gt;&lt;div class=&quot;flex space-x-2 items-center absolute top-0 right-0&quot;&gt;
    &lt;div x-cloak x-show=&quot;showMessage&quot; x-transition class=&quot;py-2 animate-bounce transition duration-300 mt-1 text-sky-500 text-xs&quot;&gt;Copied!&lt;/div&gt;
    &lt;button
        type=&quot;button&quot;
        title=&quot;Copy to clipboard&quot;
        class=&quot;hidden sm:block p-2 pl-3 transition duration-300&quot;
        @click.prevent=&quot;copyToClipboard&quot;
        :class=&quot;{
            'text-black/30 hover:text-black/80': !showMessage,
            'text-sky-500 hover:text-sky-700': showMessage,
        }&quot;&gt;
        &lt;svg xmlns=&quot;http://www.w3.org/2000/svg&quot; fill=&quot;none&quot; viewBox=&quot;0 0 24 24&quot; stroke-width=&quot;1.5&quot; stroke=&quot;currentColor&quot; class=&quot;block w-6 h-6&quot;&gt;
            &lt;path fill=&quot;white&quot; stroke-linecap=&quot;round&quot; stroke-linejoin=&quot;round&quot; d=&quot;M11.35 3.836c-.065.21-.1.433-.1.664 0 .414.336.75.75.75h4.5a.75.75 0 00.75-.75 2.25 2.25 0 00-.1-.664m-5.8 0A2.251 2.251 0 0113.5 2.25H15c1.012 0 1.867.668 2.15 1.586m-5.8 0c-.376.023-.75.05-1.124.08C9.095 4.01 8.25 4.973 8.25 6.108V8.25m8.9-4.414c.376.023.75.05 1.124.08 1.131.094 1.976 1.057 1.976 2.192V16.5A2.25 2.25 0 0118 18.75h-2.25m-7.5-10.5H4.875c-.621 0-1.125.504-1.125 1.125v11.25c0 .621.504 1.125 1.125 1.125h9.75c.621 0 1.125-.504 1.125-1.125V18.75m-7.5-10.5h6.375c.621 0 1.125.504 1.125 1.125v9.375m-8.25-3l1.5 1.5 3-3.75&quot; /&gt;
        &lt;/svg&gt;
    &lt;/button&gt;
&lt;/div&gt;&lt;pre class=&quot;phiki language-shellscript github-light&quot; data-language=&quot;shellscript&quot; style=&quot;background-color: #fff;color: #24292e;&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;token&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;token&quot;&gt;Service&lt;/span&gt;&lt;span class=&quot;token&quot;&gt;]&lt;/span&gt;&lt;span class=&quot;token&quot;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;token&quot; style=&quot;color: #24292e;&quot;&gt;Environment&lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #d73a49;&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #032f62;&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #032f62;&quot;&gt;OLLAMA_HOST=0.0.0.0:11434&lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #032f62;&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span class=&quot;token&quot;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;h2&gt;&lt;a id=&quot;content-openwebui-installation&quot; href=&quot;#content-openwebui-installation&quot; class=&quot;heading-permalink&quot; aria-hidden=&quot;true&quot; tabindex=&quot;-1&quot; title=&quot;Permalink&quot;&gt;#&lt;/a&gt;OpenWebUI Installation&lt;/h2&gt;
&lt;p&gt;OpenWebUI is a web interface that gives you a ChatGPT interface to interact with your AI server.&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;https://github.com/open-webui/open-webui&quot;&gt;OpenWebUI GitHub repository&lt;/a&gt; for detailed installation instructions.&lt;/p&gt;
&lt;p&gt;Here is a quick guide to install OpenWebUI:&lt;/p&gt;
&lt;div x-data=&quot;codeBlock&quot; class=&quot;code-block relative&quot;&gt;&lt;div class=&quot;flex space-x-2 items-center absolute top-0 right-0&quot;&gt;
    &lt;div x-cloak x-show=&quot;showMessage&quot; x-transition class=&quot;py-2 animate-bounce transition duration-300 mt-1 text-sky-500 text-xs&quot;&gt;Copied!&lt;/div&gt;
    &lt;button
        type=&quot;button&quot;
        title=&quot;Copy to clipboard&quot;
        class=&quot;hidden sm:block p-2 pl-3 transition duration-300&quot;
        @click.prevent=&quot;copyToClipboard&quot;
        :class=&quot;{
            'text-black/30 hover:text-black/80': !showMessage,
            'text-sky-500 hover:text-sky-700': showMessage,
        }&quot;&gt;
        &lt;svg xmlns=&quot;http://www.w3.org/2000/svg&quot; fill=&quot;none&quot; viewBox=&quot;0 0 24 24&quot; stroke-width=&quot;1.5&quot; stroke=&quot;currentColor&quot; class=&quot;block w-6 h-6&quot;&gt;
            &lt;path fill=&quot;white&quot; stroke-linecap=&quot;round&quot; stroke-linejoin=&quot;round&quot; d=&quot;M11.35 3.836c-.065.21-.1.433-.1.664 0 .414.336.75.75.75h4.5a.75.75 0 00.75-.75 2.25 2.25 0 00-.1-.664m-5.8 0A2.251 2.251 0 0113.5 2.25H15c1.012 0 1.867.668 2.15 1.586m-5.8 0c-.376.023-.75.05-1.124.08C9.095 4.01 8.25 4.973 8.25 6.108V8.25m8.9-4.414c.376.023.75.05 1.124.08 1.131.094 1.976 1.057 1.976 2.192V16.5A2.25 2.25 0 0118 18.75h-2.25m-7.5-10.5H4.875c-.621 0-1.125.504-1.125 1.125v11.25c0 .621.504 1.125 1.125 1.125h9.75c.621 0 1.125-.504 1.125-1.125V18.75m-7.5-10.5h6.375c.621 0 1.125.504 1.125 1.125v9.375m-8.25-3l1.5 1.5 3-3.75&quot; /&gt;
        &lt;/svg&gt;
    &lt;/button&gt;
&lt;/div&gt;&lt;pre class=&quot;phiki language-shellscript github-light&quot; data-language=&quot;shellscript&quot; style=&quot;background-color: #fff;color: #24292e;&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;token&quot; style=&quot;color: #6f42c1;&quot;&gt;docker&lt;/span&gt;&lt;span class=&quot;token&quot;&gt; &lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #032f62;&quot;&gt;run&lt;/span&gt;&lt;span class=&quot;token&quot;&gt; &lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #005cc5;&quot;&gt;-&lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #005cc5;&quot;&gt;d&lt;/span&gt;&lt;span class=&quot;token&quot;&gt; &lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #005cc5;&quot;&gt;-&lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #005cc5;&quot;&gt;p&lt;/span&gt;&lt;span class=&quot;token&quot;&gt; &lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #032f62;&quot;&gt;3000:8080&lt;/span&gt;&lt;span class=&quot;token&quot;&gt; &lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #005cc5;&quot;&gt;-&lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #005cc5;&quot;&gt;-add-host=host.docker.internal:host-gateway&lt;/span&gt;&lt;span class=&quot;token&quot;&gt; &lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #005cc5;&quot;&gt;-&lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #005cc5;&quot;&gt;v&lt;/span&gt;&lt;span class=&quot;token&quot;&gt; &lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #032f62;&quot;&gt;open-webui:/app/backend/data&lt;/span&gt;&lt;span class=&quot;token&quot;&gt; &lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #005cc5;&quot;&gt;-&lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #005cc5;&quot;&gt;-name&lt;/span&gt;&lt;span class=&quot;token&quot;&gt; &lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #032f62;&quot;&gt;open-webui&lt;/span&gt;&lt;span class=&quot;token&quot;&gt; &lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #005cc5;&quot;&gt;-&lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #005cc5;&quot;&gt;-restart&lt;/span&gt;&lt;span class=&quot;token&quot;&gt; &lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #032f62;&quot;&gt;always&lt;/span&gt;&lt;span class=&quot;token&quot;&gt; &lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #032f62;&quot;&gt;ghcr.io/open-webui/open-webui:main&lt;/span&gt;&lt;span class=&quot;token&quot;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;You can now access OpenWebUI at &lt;code&gt;http://your-server-ip:3000&lt;/code&gt;.&lt;/p&gt;
&lt;p&gt;The first account created will be the admin account.&lt;/p&gt;
&lt;h2&gt;&lt;a id=&quot;content-tailscale&quot; href=&quot;#content-tailscale&quot; class=&quot;heading-permalink&quot; aria-hidden=&quot;true&quot; tabindex=&quot;-1&quot; title=&quot;Permalink&quot;&gt;#&lt;/a&gt;Tailscale&lt;/h2&gt;
&lt;p&gt;Tailscale is your personal VPN that makes it easy to connect your devices through internet without any port forwarding.&lt;/p&gt;
&lt;p&gt;To install Tailscale, the easiest way is to go to your &lt;a href=&quot;https://login.tailscale.com/admin/machines/new-linux&quot;&gt;Tailscale admin console&lt;/a&gt; and get the command to install it on your server.&lt;/p&gt;
&lt;p&gt;Then the next step is to tell Tailscale to serve OpenWebUI:&lt;/p&gt;
&lt;div x-data=&quot;codeBlock&quot; class=&quot;code-block relative&quot;&gt;&lt;div class=&quot;flex space-x-2 items-center absolute top-0 right-0&quot;&gt;
    &lt;div x-cloak x-show=&quot;showMessage&quot; x-transition class=&quot;py-2 animate-bounce transition duration-300 mt-1 text-sky-500 text-xs&quot;&gt;Copied!&lt;/div&gt;
    &lt;button
        type=&quot;button&quot;
        title=&quot;Copy to clipboard&quot;
        class=&quot;hidden sm:block p-2 pl-3 transition duration-300&quot;
        @click.prevent=&quot;copyToClipboard&quot;
        :class=&quot;{
            'text-black/30 hover:text-black/80': !showMessage,
            'text-sky-500 hover:text-sky-700': showMessage,
        }&quot;&gt;
        &lt;svg xmlns=&quot;http://www.w3.org/2000/svg&quot; fill=&quot;none&quot; viewBox=&quot;0 0 24 24&quot; stroke-width=&quot;1.5&quot; stroke=&quot;currentColor&quot; class=&quot;block w-6 h-6&quot;&gt;
            &lt;path fill=&quot;white&quot; stroke-linecap=&quot;round&quot; stroke-linejoin=&quot;round&quot; d=&quot;M11.35 3.836c-.065.21-.1.433-.1.664 0 .414.336.75.75.75h4.5a.75.75 0 00.75-.75 2.25 2.25 0 00-.1-.664m-5.8 0A2.251 2.251 0 0113.5 2.25H15c1.012 0 1.867.668 2.15 1.586m-5.8 0c-.376.023-.75.05-1.124.08C9.095 4.01 8.25 4.973 8.25 6.108V8.25m8.9-4.414c.376.023.75.05 1.124.08 1.131.094 1.976 1.057 1.976 2.192V16.5A2.25 2.25 0 0118 18.75h-2.25m-7.5-10.5H4.875c-.621 0-1.125.504-1.125 1.125v11.25c0 .621.504 1.125 1.125 1.125h9.75c.621 0 1.125-.504 1.125-1.125V18.75m-7.5-10.5h6.375c.621 0 1.125.504 1.125 1.125v9.375m-8.25-3l1.5 1.5 3-3.75&quot; /&gt;
        &lt;/svg&gt;
    &lt;/button&gt;
&lt;/div&gt;&lt;pre class=&quot;phiki language-shellscript github-light&quot; data-language=&quot;shellscript&quot; style=&quot;background-color: #fff;color: #24292e;&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;token&quot; style=&quot;color: #6f42c1;&quot;&gt;sudo&lt;/span&gt;&lt;span class=&quot;token&quot;&gt; &lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #032f62;&quot;&gt;tailscale&lt;/span&gt;&lt;span class=&quot;token&quot;&gt; &lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #032f62;&quot;&gt;serve&lt;/span&gt;&lt;span class=&quot;token&quot;&gt; &lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #005cc5;&quot;&gt;-&lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #005cc5;&quot;&gt;-bg&lt;/span&gt;&lt;span class=&quot;token&quot;&gt; &lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #005cc5;&quot;&gt;3000&lt;/span&gt;&lt;span class=&quot;token&quot;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;You can now access OpenWebUI from anywhere with your Tailscale Magic DNS with HTTPS.&lt;/p&gt;
&lt;p&gt;Example: &lt;code&gt;https://aiserver.tail1234567.ts.net&lt;/code&gt;&lt;/p&gt;
&lt;h2&gt;&lt;a id=&quot;content-phpstorm-integration&quot; href=&quot;#content-phpstorm-integration&quot; class=&quot;heading-permalink&quot; aria-hidden=&quot;true&quot; tabindex=&quot;-1&quot; title=&quot;Permalink&quot;&gt;#&lt;/a&gt;PHPStorm Integration&lt;/h2&gt;
&lt;p&gt;For PHPStorm to connect to Ollama, we need to install the offical PHPStorm AI plugin.&lt;/p&gt;
&lt;p&gt;In the configuration, you can add your Ollama server with the IP and port.&lt;/p&gt;
&lt;h2&gt;&lt;a id=&quot;content-update-ollama-and-openwebui&quot; href=&quot;#content-update-ollama-and-openwebui&quot; class=&quot;heading-permalink&quot; aria-hidden=&quot;true&quot; tabindex=&quot;-1&quot; title=&quot;Permalink&quot;&gt;#&lt;/a&gt;Update Ollama and OpenWebUI&lt;/h2&gt;
&lt;p&gt;To update OpenWebUI automatically, you can use Watchtower.&lt;/p&gt;
&lt;p&gt;Here is a command to update OpenWebUI once:&lt;/p&gt;
&lt;div x-data=&quot;codeBlock&quot; class=&quot;code-block relative&quot;&gt;&lt;div class=&quot;flex space-x-2 items-center absolute top-0 right-0&quot;&gt;
    &lt;div x-cloak x-show=&quot;showMessage&quot; x-transition class=&quot;py-2 animate-bounce transition duration-300 mt-1 text-sky-500 text-xs&quot;&gt;Copied!&lt;/div&gt;
    &lt;button
        type=&quot;button&quot;
        title=&quot;Copy to clipboard&quot;
        class=&quot;hidden sm:block p-2 pl-3 transition duration-300&quot;
        @click.prevent=&quot;copyToClipboard&quot;
        :class=&quot;{
            'text-black/30 hover:text-black/80': !showMessage,
            'text-sky-500 hover:text-sky-700': showMessage,
        }&quot;&gt;
        &lt;svg xmlns=&quot;http://www.w3.org/2000/svg&quot; fill=&quot;none&quot; viewBox=&quot;0 0 24 24&quot; stroke-width=&quot;1.5&quot; stroke=&quot;currentColor&quot; class=&quot;block w-6 h-6&quot;&gt;
            &lt;path fill=&quot;white&quot; stroke-linecap=&quot;round&quot; stroke-linejoin=&quot;round&quot; d=&quot;M11.35 3.836c-.065.21-.1.433-.1.664 0 .414.336.75.75.75h4.5a.75.75 0 00.75-.75 2.25 2.25 0 00-.1-.664m-5.8 0A2.251 2.251 0 0113.5 2.25H15c1.012 0 1.867.668 2.15 1.586m-5.8 0c-.376.023-.75.05-1.124.08C9.095 4.01 8.25 4.973 8.25 6.108V8.25m8.9-4.414c.376.023.75.05 1.124.08 1.131.094 1.976 1.057 1.976 2.192V16.5A2.25 2.25 0 0118 18.75h-2.25m-7.5-10.5H4.875c-.621 0-1.125.504-1.125 1.125v11.25c0 .621.504 1.125 1.125 1.125h9.75c.621 0 1.125-.504 1.125-1.125V18.75m-7.5-10.5h6.375c.621 0 1.125.504 1.125 1.125v9.375m-8.25-3l1.5 1.5 3-3.75&quot; /&gt;
        &lt;/svg&gt;
    &lt;/button&gt;
&lt;/div&gt;&lt;pre class=&quot;phiki language-shellscript github-light&quot; data-language=&quot;shellscript&quot; style=&quot;background-color: #fff;color: #24292e;&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;token&quot; style=&quot;color: #6f42c1;&quot;&gt;sudo&lt;/span&gt;&lt;span class=&quot;token&quot;&gt; &lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #032f62;&quot;&gt;docker&lt;/span&gt;&lt;span class=&quot;token&quot;&gt; &lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #032f62;&quot;&gt;run&lt;/span&gt;&lt;span class=&quot;token&quot;&gt; &lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #005cc5;&quot;&gt;-&lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #005cc5;&quot;&gt;-rm&lt;/span&gt;&lt;span class=&quot;token&quot;&gt; &lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #005cc5;&quot;&gt;-&lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #005cc5;&quot;&gt;-volume&lt;/span&gt;&lt;span class=&quot;token&quot;&gt; &lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #032f62;&quot;&gt;/var/run/docker.sock:/var/run/docker.sock&lt;/span&gt;&lt;span class=&quot;token&quot;&gt; &lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #032f62;&quot;&gt;containrrr/watchtower&lt;/span&gt;&lt;span class=&quot;token&quot;&gt; &lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #005cc5;&quot;&gt;-&lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #005cc5;&quot;&gt;-run-once&lt;/span&gt;&lt;span class=&quot;token&quot;&gt; &lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #032f62;&quot;&gt;open-webui&lt;/span&gt;&lt;span class=&quot;token&quot;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;And here is a command to update OpenWebUI every hour:&lt;/p&gt;
&lt;div x-data=&quot;codeBlock&quot; class=&quot;code-block relative&quot;&gt;&lt;div class=&quot;flex space-x-2 items-center absolute top-0 right-0&quot;&gt;
    &lt;div x-cloak x-show=&quot;showMessage&quot; x-transition class=&quot;py-2 animate-bounce transition duration-300 mt-1 text-sky-500 text-xs&quot;&gt;Copied!&lt;/div&gt;
    &lt;button
        type=&quot;button&quot;
        title=&quot;Copy to clipboard&quot;
        class=&quot;hidden sm:block p-2 pl-3 transition duration-300&quot;
        @click.prevent=&quot;copyToClipboard&quot;
        :class=&quot;{
            'text-black/30 hover:text-black/80': !showMessage,
            'text-sky-500 hover:text-sky-700': showMessage,
        }&quot;&gt;
        &lt;svg xmlns=&quot;http://www.w3.org/2000/svg&quot; fill=&quot;none&quot; viewBox=&quot;0 0 24 24&quot; stroke-width=&quot;1.5&quot; stroke=&quot;currentColor&quot; class=&quot;block w-6 h-6&quot;&gt;
            &lt;path fill=&quot;white&quot; stroke-linecap=&quot;round&quot; stroke-linejoin=&quot;round&quot; d=&quot;M11.35 3.836c-.065.21-.1.433-.1.664 0 .414.336.75.75.75h4.5a.75.75 0 00.75-.75 2.25 2.25 0 00-.1-.664m-5.8 0A2.251 2.251 0 0113.5 2.25H15c1.012 0 1.867.668 2.15 1.586m-5.8 0c-.376.023-.75.05-1.124.08C9.095 4.01 8.25 4.973 8.25 6.108V8.25m8.9-4.414c.376.023.75.05 1.124.08 1.131.094 1.976 1.057 1.976 2.192V16.5A2.25 2.25 0 0118 18.75h-2.25m-7.5-10.5H4.875c-.621 0-1.125.504-1.125 1.125v11.25c0 .621.504 1.125 1.125 1.125h9.75c.621 0 1.125-.504 1.125-1.125V18.75m-7.5-10.5h6.375c.621 0 1.125.504 1.125 1.125v9.375m-8.25-3l1.5 1.5 3-3.75&quot; /&gt;
        &lt;/svg&gt;
    &lt;/button&gt;
&lt;/div&gt;&lt;pre class=&quot;phiki language-shellscript github-light&quot; data-language=&quot;shellscript&quot; style=&quot;background-color: #fff;color: #24292e;&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;token&quot; style=&quot;color: #6f42c1;&quot;&gt;sudo&lt;/span&gt;&lt;span class=&quot;token&quot;&gt; &lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #032f62;&quot;&gt;docker&lt;/span&gt;&lt;span class=&quot;token&quot;&gt; &lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #032f62;&quot;&gt;run&lt;/span&gt;&lt;span class=&quot;token&quot;&gt; &lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #005cc5;&quot;&gt;-&lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #005cc5;&quot;&gt;d&lt;/span&gt;&lt;span class=&quot;token&quot;&gt; &lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #005cc5;&quot;&gt;\
&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;token&quot;&gt;--restart&lt;/span&gt;&lt;span class=&quot;token&quot;&gt; &lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #032f62;&quot;&gt;always&lt;/span&gt;&lt;span class=&quot;token&quot;&gt; &lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #005cc5;&quot;&gt;\
&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;token&quot;&gt;--volume&lt;/span&gt;&lt;span class=&quot;token&quot;&gt; &lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #032f62;&quot;&gt;/var/run/docker.sock:/var/run/docker.sock&lt;/span&gt;&lt;span class=&quot;token&quot;&gt; &lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #005cc5;&quot;&gt;\
&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;token&quot;&gt;containrrr/watchtower&lt;/span&gt;&lt;span class=&quot;token&quot;&gt; &lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #005cc5;&quot;&gt;-&lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #005cc5;&quot;&gt;-interval&lt;/span&gt;&lt;span class=&quot;token&quot;&gt; &lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #005cc5;&quot;&gt;3600&lt;/span&gt;&lt;span class=&quot;token&quot;&gt; &lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #032f62;&quot;&gt;open-webui&lt;/span&gt;&lt;span class=&quot;token&quot;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;The only way to update Ollama is to run the install script again.&lt;/p&gt;
&lt;p&gt;Here is a command to update Ollama every week:&lt;/p&gt;
&lt;div x-data=&quot;codeBlock&quot; class=&quot;code-block relative&quot;&gt;&lt;div class=&quot;flex space-x-2 items-center absolute top-0 right-0&quot;&gt;
    &lt;div x-cloak x-show=&quot;showMessage&quot; x-transition class=&quot;py-2 animate-bounce transition duration-300 mt-1 text-sky-500 text-xs&quot;&gt;Copied!&lt;/div&gt;
    &lt;button
        type=&quot;button&quot;
        title=&quot;Copy to clipboard&quot;
        class=&quot;hidden sm:block p-2 pl-3 transition duration-300&quot;
        @click.prevent=&quot;copyToClipboard&quot;
        :class=&quot;{
            'text-black/30 hover:text-black/80': !showMessage,
            'text-sky-500 hover:text-sky-700': showMessage,
        }&quot;&gt;
        &lt;svg xmlns=&quot;http://www.w3.org/2000/svg&quot; fill=&quot;none&quot; viewBox=&quot;0 0 24 24&quot; stroke-width=&quot;1.5&quot; stroke=&quot;currentColor&quot; class=&quot;block w-6 h-6&quot;&gt;
            &lt;path fill=&quot;white&quot; stroke-linecap=&quot;round&quot; stroke-linejoin=&quot;round&quot; d=&quot;M11.35 3.836c-.065.21-.1.433-.1.664 0 .414.336.75.75.75h4.5a.75.75 0 00.75-.75 2.25 2.25 0 00-.1-.664m-5.8 0A2.251 2.251 0 0113.5 2.25H15c1.012 0 1.867.668 2.15 1.586m-5.8 0c-.376.023-.75.05-1.124.08C9.095 4.01 8.25 4.973 8.25 6.108V8.25m8.9-4.414c.376.023.75.05 1.124.08 1.131.094 1.976 1.057 1.976 2.192V16.5A2.25 2.25 0 0118 18.75h-2.25m-7.5-10.5H4.875c-.621 0-1.125.504-1.125 1.125v11.25c0 .621.504 1.125 1.125 1.125h9.75c.621 0 1.125-.504 1.125-1.125V18.75m-7.5-10.5h6.375c.621 0 1.125.504 1.125 1.125v9.375m-8.25-3l1.5 1.5 3-3.75&quot; /&gt;
        &lt;/svg&gt;
    &lt;/button&gt;
&lt;/div&gt;&lt;pre class=&quot;phiki language-shellscript github-light&quot; data-language=&quot;shellscript&quot; style=&quot;background-color: #fff;color: #24292e;&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;token&quot; style=&quot;color: #6f42c1;&quot;&gt;sudo&lt;/span&gt;&lt;span class=&quot;token&quot;&gt; &lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #032f62;&quot;&gt;crontab&lt;/span&gt;&lt;span class=&quot;token&quot;&gt; &lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #005cc5;&quot;&gt;-&lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #005cc5;&quot;&gt;e&lt;/span&gt;&lt;span class=&quot;token&quot;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;Add the following line to the file:&lt;/p&gt;
&lt;div x-data=&quot;codeBlock&quot; class=&quot;code-block relative&quot;&gt;&lt;div class=&quot;flex space-x-2 items-center absolute top-0 right-0&quot;&gt;
    &lt;div x-cloak x-show=&quot;showMessage&quot; x-transition class=&quot;py-2 animate-bounce transition duration-300 mt-1 text-sky-500 text-xs&quot;&gt;Copied!&lt;/div&gt;
    &lt;button
        type=&quot;button&quot;
        title=&quot;Copy to clipboard&quot;
        class=&quot;hidden sm:block p-2 pl-3 transition duration-300&quot;
        @click.prevent=&quot;copyToClipboard&quot;
        :class=&quot;{
            'text-black/30 hover:text-black/80': !showMessage,
            'text-sky-500 hover:text-sky-700': showMessage,
        }&quot;&gt;
        &lt;svg xmlns=&quot;http://www.w3.org/2000/svg&quot; fill=&quot;none&quot; viewBox=&quot;0 0 24 24&quot; stroke-width=&quot;1.5&quot; stroke=&quot;currentColor&quot; class=&quot;block w-6 h-6&quot;&gt;
            &lt;path fill=&quot;white&quot; stroke-linecap=&quot;round&quot; stroke-linejoin=&quot;round&quot; d=&quot;M11.35 3.836c-.065.21-.1.433-.1.664 0 .414.336.75.75.75h4.5a.75.75 0 00.75-.75 2.25 2.25 0 00-.1-.664m-5.8 0A2.251 2.251 0 0113.5 2.25H15c1.012 0 1.867.668 2.15 1.586m-5.8 0c-.376.023-.75.05-1.124.08C9.095 4.01 8.25 4.973 8.25 6.108V8.25m8.9-4.414c.376.023.75.05 1.124.08 1.131.094 1.976 1.057 1.976 2.192V16.5A2.25 2.25 0 0118 18.75h-2.25m-7.5-10.5H4.875c-.621 0-1.125.504-1.125 1.125v11.25c0 .621.504 1.125 1.125 1.125h9.75c.621 0 1.125-.504 1.125-1.125V18.75m-7.5-10.5h6.375c.621 0 1.125.504 1.125 1.125v9.375m-8.25-3l1.5 1.5 3-3.75&quot; /&gt;
        &lt;/svg&gt;
    &lt;/button&gt;
&lt;/div&gt;&lt;pre class=&quot;phiki language-shellscript github-light&quot; data-language=&quot;shellscript&quot; style=&quot;background-color: #fff;color: #24292e;&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;token&quot;&gt;0&lt;/span&gt;&lt;span class=&quot;token&quot;&gt; &lt;/span&gt;&lt;span class=&quot;token&quot;&gt;0&lt;/span&gt;&lt;span class=&quot;token&quot;&gt; &lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #005cc5;&quot;&gt;*&lt;/span&gt;&lt;span class=&quot;token&quot;&gt; &lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #005cc5;&quot;&gt;*&lt;/span&gt;&lt;span class=&quot;token&quot;&gt; &lt;/span&gt;&lt;span class=&quot;token&quot;&gt;0&lt;/span&gt;&lt;span class=&quot;token&quot;&gt; &lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #032f62;&quot;&gt;curl&lt;/span&gt;&lt;span class=&quot;token&quot;&gt; &lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #005cc5;&quot;&gt;-&lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #005cc5;&quot;&gt;fsSL&lt;/span&gt;&lt;span class=&quot;token&quot;&gt; &lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #032f62;&quot;&gt;https://ollama.com/install.sh&lt;/span&gt;&lt;span class=&quot;token&quot;&gt; &lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #d73a49;&quot;&gt;|&lt;/span&gt;&lt;span class=&quot;token&quot;&gt; &lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #6f42c1;&quot;&gt;sh&lt;/span&gt;&lt;span class=&quot;token&quot;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;h2&gt;&lt;a id=&quot;content-conclusion&quot; href=&quot;#content-conclusion&quot; class=&quot;heading-permalink&quot; aria-hidden=&quot;true&quot; tabindex=&quot;-1&quot; title=&quot;Permalink&quot;&gt;#&lt;/a&gt;Conclusion&lt;/h2&gt;
&lt;p&gt;And voilà!&lt;/p&gt;
&lt;p&gt;You now have a personal AI server that you can access from anywhere with PHPStorm and OpenWebUI.&lt;/p&gt;
&lt;p&gt;You should dig into the documentation of Ollama and OpenWebUI to see all the features they offer.&lt;/p&gt;
&lt;p&gt;Examples of advanced features you can explore:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Image generation&lt;/li&gt;
&lt;li&gt;Indexing documents with embeddings&lt;/li&gt;
&lt;li&gt;Chat with ChatGPT and local models at the same time&lt;/li&gt;
&lt;li&gt;Use multi modal models like &lt;code&gt;llama3.2-vision&lt;/code&gt;&lt;/li&gt;
&lt;/ul&gt;</summary>
        <content type="html">&lt;p&gt;This is a guide on how to set up an AI server on Proxmox, connect it to PHPStorm, and use Tailscale for remote access.&lt;/p&gt;
&lt;!--more--&gt;  
&lt;p&gt;I have a rather beefy server at home that I use mostly as my Windows gaming machine. It runs Proxmox because, from the beginning, I knew I wanted a server where I could run VMs and containers from a distance.&lt;/p&gt;
&lt;p&gt;You may not know, but I travel a lot with my van, and I can't bring all my equipment with me.&lt;/p&gt;
&lt;p&gt;For context, here are the hardware specs of my server:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;CPU:&lt;/strong&gt; AMD Ryzen 9 5900X 12-Core Processor&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;RAM:&lt;/strong&gt; 32GB (I need to upgrade it to 128GB or something)&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;GPU:&lt;/strong&gt; Nvidia RTX 3070 + Nvidia RTX 3060 Ti&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Storage:&lt;/strong&gt; 2TB NVMe + 2x 60GB SSD&lt;/li&gt;
&lt;/ul&gt;
&lt;ul class=&quot;table-of-contents not-prose&quot;&gt;
&lt;li&gt;&lt;a href=&quot;#content-create-a-new-vm&quot;&gt;Create a new VM&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;#content-install-required-nvidia-cuda-drivers-and-toolkit&quot;&gt;Install required Nvidia CUDA Drivers and Toolkit&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;#content-docker-installation&quot;&gt;Docker Installation&lt;/a&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;#content-install-nvidia-container-toolkit&quot;&gt;Install Nvidia Container Toolkit&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;#content-use-ollama-for-running-ai-models&quot;&gt;Use Ollama for running AI models&lt;/a&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;#content-basic-usage-of-ollama&quot;&gt;Basic Usage of Ollama&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;#content-make-ollama-listen-outside-of-localhost&quot;&gt;Make Ollama listen outside of localhost&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;#content-openwebui-installation&quot;&gt;OpenWebUI Installation&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;#content-tailscale&quot;&gt;Tailscale&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;#content-phpstorm-integration&quot;&gt;PHPStorm Integration&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;#content-update-ollama-and-openwebui&quot;&gt;Update Ollama and OpenWebUI&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;#content-conclusion&quot;&gt;Conclusion&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;&lt;a id=&quot;content-create-a-new-vm&quot; href=&quot;#content-create-a-new-vm&quot; class=&quot;heading-permalink&quot; aria-hidden=&quot;true&quot; tabindex=&quot;-1&quot; title=&quot;Permalink&quot;&gt;#&lt;/a&gt;Create a new VM&lt;/h2&gt;
&lt;p&gt;We begin by setting up an Ubuntu VM on Proxmox, allocating the necessary resources for your AI server. You can download an ISO and create a new VM from it with the console, but I prefer to use a script to automate the process.&lt;/p&gt;
&lt;p&gt;The script comes from the &lt;a href=&quot;https://community-scripts.github.io/ProxmoxVE/&quot;&gt;community-scripts&lt;/a&gt; repository, and it's a simple bash script that you can run on your Proxmox server.&lt;/p&gt;
&lt;p&gt;Run the following script to deploy the Ubuntu VM:&lt;/p&gt;
&lt;div x-data=&quot;codeBlock&quot; class=&quot;code-block relative&quot;&gt;&lt;div class=&quot;flex space-x-2 items-center absolute top-0 right-0&quot;&gt;
    &lt;div x-cloak x-show=&quot;showMessage&quot; x-transition class=&quot;py-2 animate-bounce transition duration-300 mt-1 text-sky-500 text-xs&quot;&gt;Copied!&lt;/div&gt;
    &lt;button
        type=&quot;button&quot;
        title=&quot;Copy to clipboard&quot;
        class=&quot;hidden sm:block p-2 pl-3 transition duration-300&quot;
        @click.prevent=&quot;copyToClipboard&quot;
        :class=&quot;{
            'text-black/30 hover:text-black/80': !showMessage,
            'text-sky-500 hover:text-sky-700': showMessage,
        }&quot;&gt;
        &lt;svg xmlns=&quot;http://www.w3.org/2000/svg&quot; fill=&quot;none&quot; viewBox=&quot;0 0 24 24&quot; stroke-width=&quot;1.5&quot; stroke=&quot;currentColor&quot; class=&quot;block w-6 h-6&quot;&gt;
            &lt;path fill=&quot;white&quot; stroke-linecap=&quot;round&quot; stroke-linejoin=&quot;round&quot; d=&quot;M11.35 3.836c-.065.21-.1.433-.1.664 0 .414.336.75.75.75h4.5a.75.75 0 00.75-.75 2.25 2.25 0 00-.1-.664m-5.8 0A2.251 2.251 0 0113.5 2.25H15c1.012 0 1.867.668 2.15 1.586m-5.8 0c-.376.023-.75.05-1.124.08C9.095 4.01 8.25 4.973 8.25 6.108V8.25m8.9-4.414c.376.023.75.05 1.124.08 1.131.094 1.976 1.057 1.976 2.192V16.5A2.25 2.25 0 0118 18.75h-2.25m-7.5-10.5H4.875c-.621 0-1.125.504-1.125 1.125v11.25c0 .621.504 1.125 1.125 1.125h9.75c.621 0 1.125-.504 1.125-1.125V18.75m-7.5-10.5h6.375c.621 0 1.125.504 1.125 1.125v9.375m-8.25-3l1.5 1.5 3-3.75&quot; /&gt;
        &lt;/svg&gt;
    &lt;/button&gt;
&lt;/div&gt;&lt;pre class=&quot;phiki language-shellscript github-light&quot; data-language=&quot;shellscript&quot; style=&quot;background-color: #fff;color: #24292e;&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;token&quot; style=&quot;color: #6f42c1;&quot;&gt;bash&lt;/span&gt;&lt;span class=&quot;token&quot;&gt; &lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #005cc5;&quot;&gt;-&lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #005cc5;&quot;&gt;c&lt;/span&gt;&lt;span class=&quot;token&quot;&gt; &lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #032f62;&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #032f62;&quot;&gt;$(&lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #6f42c1;&quot;&gt;wget&lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #032f62;&quot;&gt; &lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #005cc5;&quot;&gt;-&lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #005cc5;&quot;&gt;qLO&lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #032f62;&quot;&gt; &lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #032f62;&quot;&gt;-&lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #032f62;&quot;&gt; [Proxmox&lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #032f62;&quot;&gt; &lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #032f62;&quot;&gt;script]&lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #032f62;&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #6f42c1;&quot;&gt;https://github.com/community-scripts/ProxmoxVE/raw/main/vm/ubuntu2404-vm.sh&lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #032f62;&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #032f62;&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #032f62;&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span class=&quot;token&quot;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;The script will ask you for some information; here is what I used:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;I allocated &lt;strong&gt;512 Go&lt;/strong&gt; storage because LLVM models are huge.&lt;/li&gt;
&lt;li&gt;I gave it &lt;strong&gt;24 576 MB&lt;/strong&gt; RAM. I tried with 32 GB, but it made my server crash. Keep some RAM for the host. Ollama is great at distributing the load on the CPU and GPUs. This gives me plenty of room to test large models.&lt;/li&gt;
&lt;li&gt;Do not start the VM immediately after installation.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;After the installation is finished, in the &lt;strong&gt;Cloud-Init&lt;/strong&gt; tab:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Configure the user &lt;code&gt;user&lt;/code&gt;, set a password, and/or add your public SSH key.&lt;/li&gt;
&lt;li&gt;I chose to use DHCP for the network configuration because I will only access it from my Tailscale network.&lt;/li&gt;
&lt;li&gt;Click on &lt;strong&gt;Regenerate image&lt;/strong&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Before starting the VM, go to the &lt;strong&gt;Hardware&lt;/strong&gt; tab and add your GPU to the VM.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Add&lt;/strong&gt; -&amp;gt; &lt;strong&gt;PCI Device&lt;/strong&gt; -&amp;gt; &lt;strong&gt;Raw Device&lt;/strong&gt; -&amp;gt; &lt;strong&gt;Your GPU&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;Check &lt;strong&gt;All functions&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;In the advanced options, check &lt;strong&gt;ROM-Bar&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Start&lt;/strong&gt; the VM.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;After that, you have a fresh Ubuntu VM ready to be used.&lt;/p&gt;
&lt;p&gt;I took some time to install ZSH and Oh-My-Zsh, but do as you wish.&lt;/p&gt;
&lt;h2&gt;&lt;a id=&quot;content-install-required-nvidia-cuda-drivers-and-toolkit&quot; href=&quot;#content-install-required-nvidia-cuda-drivers-and-toolkit&quot; class=&quot;heading-permalink&quot; aria-hidden=&quot;true&quot; tabindex=&quot;-1&quot; title=&quot;Permalink&quot;&gt;#&lt;/a&gt;Install required Nvidia CUDA Drivers and Toolkit&lt;/h2&gt;
&lt;p&gt;Now it's time to configure this server to work well with AI models.&lt;/p&gt;
&lt;p&gt;Start by confirming that your GPU is detected with:&lt;/p&gt;
&lt;div x-data=&quot;codeBlock&quot; class=&quot;code-block relative&quot;&gt;&lt;div class=&quot;flex space-x-2 items-center absolute top-0 right-0&quot;&gt;
    &lt;div x-cloak x-show=&quot;showMessage&quot; x-transition class=&quot;py-2 animate-bounce transition duration-300 mt-1 text-sky-500 text-xs&quot;&gt;Copied!&lt;/div&gt;
    &lt;button
        type=&quot;button&quot;
        title=&quot;Copy to clipboard&quot;
        class=&quot;hidden sm:block p-2 pl-3 transition duration-300&quot;
        @click.prevent=&quot;copyToClipboard&quot;
        :class=&quot;{
            'text-black/30 hover:text-black/80': !showMessage,
            'text-sky-500 hover:text-sky-700': showMessage,
        }&quot;&gt;
        &lt;svg xmlns=&quot;http://www.w3.org/2000/svg&quot; fill=&quot;none&quot; viewBox=&quot;0 0 24 24&quot; stroke-width=&quot;1.5&quot; stroke=&quot;currentColor&quot; class=&quot;block w-6 h-6&quot;&gt;
            &lt;path fill=&quot;white&quot; stroke-linecap=&quot;round&quot; stroke-linejoin=&quot;round&quot; d=&quot;M11.35 3.836c-.065.21-.1.433-.1.664 0 .414.336.75.75.75h4.5a.75.75 0 00.75-.75 2.25 2.25 0 00-.1-.664m-5.8 0A2.251 2.251 0 0113.5 2.25H15c1.012 0 1.867.668 2.15 1.586m-5.8 0c-.376.023-.75.05-1.124.08C9.095 4.01 8.25 4.973 8.25 6.108V8.25m8.9-4.414c.376.023.75.05 1.124.08 1.131.094 1.976 1.057 1.976 2.192V16.5A2.25 2.25 0 0118 18.75h-2.25m-7.5-10.5H4.875c-.621 0-1.125.504-1.125 1.125v11.25c0 .621.504 1.125 1.125 1.125h9.75c.621 0 1.125-.504 1.125-1.125V18.75m-7.5-10.5h6.375c.621 0 1.125.504 1.125 1.125v9.375m-8.25-3l1.5 1.5 3-3.75&quot; /&gt;
        &lt;/svg&gt;
    &lt;/button&gt;
&lt;/div&gt;&lt;pre class=&quot;phiki language-shellscript github-light&quot; data-language=&quot;shellscript&quot; style=&quot;background-color: #fff;color: #24292e;&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;token&quot; style=&quot;color: #6f42c1;&quot;&gt;lspci&lt;/span&gt;&lt;span class=&quot;token&quot;&gt; &lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #d73a49;&quot;&gt;|&lt;/span&gt;&lt;span class=&quot;token&quot;&gt; &lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #6f42c1;&quot;&gt;grep&lt;/span&gt;&lt;span class=&quot;token&quot;&gt; &lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #005cc5;&quot;&gt;-&lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #005cc5;&quot;&gt;i&lt;/span&gt;&lt;span class=&quot;token&quot;&gt; &lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #032f62;&quot;&gt;nvidia&lt;/span&gt;&lt;span class=&quot;token&quot;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;Now we need to install Nvidia's CUDA Toolkit and drivers.&lt;br /&gt;
The instructions for your machine can be found here &lt;a href=&quot;https://developer.nvidia.com/cuda-downloads?target_os=Linux&amp;amp;target_arch=x86_64&amp;amp;Distribution=Ubuntu&amp;amp;target_version=24.04&amp;amp;target_type=deb_network&quot;&gt;CUDA downloads page&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;For our Ubuntu 24.04, we will use the following commands:&lt;/p&gt;
&lt;div x-data=&quot;codeBlock&quot; class=&quot;code-block relative&quot;&gt;&lt;div class=&quot;flex space-x-2 items-center absolute top-0 right-0&quot;&gt;
    &lt;div x-cloak x-show=&quot;showMessage&quot; x-transition class=&quot;py-2 animate-bounce transition duration-300 mt-1 text-sky-500 text-xs&quot;&gt;Copied!&lt;/div&gt;
    &lt;button
        type=&quot;button&quot;
        title=&quot;Copy to clipboard&quot;
        class=&quot;hidden sm:block p-2 pl-3 transition duration-300&quot;
        @click.prevent=&quot;copyToClipboard&quot;
        :class=&quot;{
            'text-black/30 hover:text-black/80': !showMessage,
            'text-sky-500 hover:text-sky-700': showMessage,
        }&quot;&gt;
        &lt;svg xmlns=&quot;http://www.w3.org/2000/svg&quot; fill=&quot;none&quot; viewBox=&quot;0 0 24 24&quot; stroke-width=&quot;1.5&quot; stroke=&quot;currentColor&quot; class=&quot;block w-6 h-6&quot;&gt;
            &lt;path fill=&quot;white&quot; stroke-linecap=&quot;round&quot; stroke-linejoin=&quot;round&quot; d=&quot;M11.35 3.836c-.065.21-.1.433-.1.664 0 .414.336.75.75.75h4.5a.75.75 0 00.75-.75 2.25 2.25 0 00-.1-.664m-5.8 0A2.251 2.251 0 0113.5 2.25H15c1.012 0 1.867.668 2.15 1.586m-5.8 0c-.376.023-.75.05-1.124.08C9.095 4.01 8.25 4.973 8.25 6.108V8.25m8.9-4.414c.376.023.75.05 1.124.08 1.131.094 1.976 1.057 1.976 2.192V16.5A2.25 2.25 0 0118 18.75h-2.25m-7.5-10.5H4.875c-.621 0-1.125.504-1.125 1.125v11.25c0 .621.504 1.125 1.125 1.125h9.75c.621 0 1.125-.504 1.125-1.125V18.75m-7.5-10.5h6.375c.621 0 1.125.504 1.125 1.125v9.375m-8.25-3l1.5 1.5 3-3.75&quot; /&gt;
        &lt;/svg&gt;
    &lt;/button&gt;
&lt;/div&gt;&lt;pre class=&quot;phiki language-shellscript github-light&quot; data-language=&quot;shellscript&quot; style=&quot;background-color: #fff;color: #24292e;&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;token&quot; style=&quot;color: #6f42c1;&quot;&gt;wget&lt;/span&gt;&lt;span class=&quot;token&quot;&gt; &lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #032f62;&quot;&gt;https://developer.download.nvidia.com/compute/cuda/repos/ubuntu2404/x86_64/cuda-keyring_1.1-1_all.deb&lt;/span&gt;&lt;span class=&quot;token&quot;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;token&quot; style=&quot;color: #6f42c1;&quot;&gt;sudo&lt;/span&gt;&lt;span class=&quot;token&quot;&gt; &lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #032f62;&quot;&gt;dpkg&lt;/span&gt;&lt;span class=&quot;token&quot;&gt; &lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #005cc5;&quot;&gt;-&lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #005cc5;&quot;&gt;i&lt;/span&gt;&lt;span class=&quot;token&quot;&gt; &lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #032f62;&quot;&gt;cuda-keyring_1.1-1_all.deb&lt;/span&gt;&lt;span class=&quot;token&quot;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;token&quot; style=&quot;color: #6f42c1;&quot;&gt;sudo&lt;/span&gt;&lt;span class=&quot;token&quot;&gt; &lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #032f62;&quot;&gt;apt-get&lt;/span&gt;&lt;span class=&quot;token&quot;&gt; &lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #032f62;&quot;&gt;update&lt;/span&gt;&lt;span class=&quot;token&quot;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;token&quot; style=&quot;color: #6f42c1;&quot;&gt;sudo&lt;/span&gt;&lt;span class=&quot;token&quot;&gt; &lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #032f62;&quot;&gt;apt-get&lt;/span&gt;&lt;span class=&quot;token&quot;&gt; &lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #005cc5;&quot;&gt;-&lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #005cc5;&quot;&gt;y&lt;/span&gt;&lt;span class=&quot;token&quot;&gt; &lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #032f62;&quot;&gt;install&lt;/span&gt;&lt;span class=&quot;token&quot;&gt; &lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #032f62;&quot;&gt;cuda-toolkit-12-8&lt;/span&gt;&lt;span class=&quot;token&quot;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;token&quot; style=&quot;color: #6f42c1;&quot;&gt;sudo&lt;/span&gt;&lt;span class=&quot;token&quot;&gt; &lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #032f62;&quot;&gt;apt-get&lt;/span&gt;&lt;span class=&quot;token&quot;&gt; &lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #032f62;&quot;&gt;install&lt;/span&gt;&lt;span class=&quot;token&quot;&gt; &lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #005cc5;&quot;&gt;-&lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #005cc5;&quot;&gt;y&lt;/span&gt;&lt;span class=&quot;token&quot;&gt; &lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #032f62;&quot;&gt;cuda-drivers&lt;/span&gt;&lt;span class=&quot;token&quot;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;Now we need to reboot the server to apply the changes:&lt;/p&gt;
&lt;div x-data=&quot;codeBlock&quot; class=&quot;code-block relative&quot;&gt;&lt;div class=&quot;flex space-x-2 items-center absolute top-0 right-0&quot;&gt;
    &lt;div x-cloak x-show=&quot;showMessage&quot; x-transition class=&quot;py-2 animate-bounce transition duration-300 mt-1 text-sky-500 text-xs&quot;&gt;Copied!&lt;/div&gt;
    &lt;button
        type=&quot;button&quot;
        title=&quot;Copy to clipboard&quot;
        class=&quot;hidden sm:block p-2 pl-3 transition duration-300&quot;
        @click.prevent=&quot;copyToClipboard&quot;
        :class=&quot;{
            'text-black/30 hover:text-black/80': !showMessage,
            'text-sky-500 hover:text-sky-700': showMessage,
        }&quot;&gt;
        &lt;svg xmlns=&quot;http://www.w3.org/2000/svg&quot; fill=&quot;none&quot; viewBox=&quot;0 0 24 24&quot; stroke-width=&quot;1.5&quot; stroke=&quot;currentColor&quot; class=&quot;block w-6 h-6&quot;&gt;
            &lt;path fill=&quot;white&quot; stroke-linecap=&quot;round&quot; stroke-linejoin=&quot;round&quot; d=&quot;M11.35 3.836c-.065.21-.1.433-.1.664 0 .414.336.75.75.75h4.5a.75.75 0 00.75-.75 2.25 2.25 0 00-.1-.664m-5.8 0A2.251 2.251 0 0113.5 2.25H15c1.012 0 1.867.668 2.15 1.586m-5.8 0c-.376.023-.75.05-1.124.08C9.095 4.01 8.25 4.973 8.25 6.108V8.25m8.9-4.414c.376.023.75.05 1.124.08 1.131.094 1.976 1.057 1.976 2.192V16.5A2.25 2.25 0 0118 18.75h-2.25m-7.5-10.5H4.875c-.621 0-1.125.504-1.125 1.125v11.25c0 .621.504 1.125 1.125 1.125h9.75c.621 0 1.125-.504 1.125-1.125V18.75m-7.5-10.5h6.375c.621 0 1.125.504 1.125 1.125v9.375m-8.25-3l1.5 1.5 3-3.75&quot; /&gt;
        &lt;/svg&gt;
    &lt;/button&gt;
&lt;/div&gt;&lt;pre class=&quot;phiki language-shellscript github-light&quot; data-language=&quot;shellscript&quot; style=&quot;background-color: #fff;color: #24292e;&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;token&quot; style=&quot;color: #6f42c1;&quot;&gt;sudo&lt;/span&gt;&lt;span class=&quot;token&quot;&gt; &lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #032f62;&quot;&gt;reboot&lt;/span&gt;&lt;span class=&quot;token&quot;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;Set the environment variables:&lt;/p&gt;
&lt;div x-data=&quot;codeBlock&quot; class=&quot;code-block relative&quot;&gt;&lt;div class=&quot;flex space-x-2 items-center absolute top-0 right-0&quot;&gt;
    &lt;div x-cloak x-show=&quot;showMessage&quot; x-transition class=&quot;py-2 animate-bounce transition duration-300 mt-1 text-sky-500 text-xs&quot;&gt;Copied!&lt;/div&gt;
    &lt;button
        type=&quot;button&quot;
        title=&quot;Copy to clipboard&quot;
        class=&quot;hidden sm:block p-2 pl-3 transition duration-300&quot;
        @click.prevent=&quot;copyToClipboard&quot;
        :class=&quot;{
            'text-black/30 hover:text-black/80': !showMessage,
            'text-sky-500 hover:text-sky-700': showMessage,
        }&quot;&gt;
        &lt;svg xmlns=&quot;http://www.w3.org/2000/svg&quot; fill=&quot;none&quot; viewBox=&quot;0 0 24 24&quot; stroke-width=&quot;1.5&quot; stroke=&quot;currentColor&quot; class=&quot;block w-6 h-6&quot;&gt;
            &lt;path fill=&quot;white&quot; stroke-linecap=&quot;round&quot; stroke-linejoin=&quot;round&quot; d=&quot;M11.35 3.836c-.065.21-.1.433-.1.664 0 .414.336.75.75.75h4.5a.75.75 0 00.75-.75 2.25 2.25 0 00-.1-.664m-5.8 0A2.251 2.251 0 0113.5 2.25H15c1.012 0 1.867.668 2.15 1.586m-5.8 0c-.376.023-.75.05-1.124.08C9.095 4.01 8.25 4.973 8.25 6.108V8.25m8.9-4.414c.376.023.75.05 1.124.08 1.131.094 1.976 1.057 1.976 2.192V16.5A2.25 2.25 0 0118 18.75h-2.25m-7.5-10.5H4.875c-.621 0-1.125.504-1.125 1.125v11.25c0 .621.504 1.125 1.125 1.125h9.75c.621 0 1.125-.504 1.125-1.125V18.75m-7.5-10.5h6.375c.621 0 1.125.504 1.125 1.125v9.375m-8.25-3l1.5 1.5 3-3.75&quot; /&gt;
        &lt;/svg&gt;
    &lt;/button&gt;
&lt;/div&gt;&lt;pre class=&quot;phiki language-shellscript github-light&quot; data-language=&quot;shellscript&quot; style=&quot;background-color: #fff;color: #24292e;&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;token&quot; style=&quot;color: #d73a49;&quot;&gt;export&lt;/span&gt;&lt;span class=&quot;token&quot;&gt; &lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #24292e;&quot;&gt;PATH&lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #d73a49;&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;token&quot;&gt;/&lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #24292e;&quot;&gt;usr&lt;/span&gt;&lt;span class=&quot;token&quot;&gt;/&lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #24292e;&quot;&gt;local&lt;/span&gt;&lt;span class=&quot;token&quot;&gt;/&lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #24292e;&quot;&gt;cuda-12&lt;/span&gt;&lt;span class=&quot;token&quot;&gt;/&lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #24292e;&quot;&gt;bin&lt;/span&gt;&lt;span class=&quot;token&quot;&gt;$&lt;/span&gt;&lt;span class=&quot;token&quot;&gt;{&lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #24292e;&quot;&gt;PATH&lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #d73a49;&quot;&gt;:&lt;/span&gt;&lt;span class=&quot;token&quot;&gt;+&lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #d73a49;&quot;&gt;:&lt;/span&gt;&lt;span class=&quot;token&quot;&gt;$&lt;/span&gt;&lt;span class=&quot;token&quot;&gt;{&lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #24292e;&quot;&gt;PATH&lt;/span&gt;&lt;span class=&quot;token&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;token&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;token&quot;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;token&quot; style=&quot;color: #d73a49;&quot;&gt;export&lt;/span&gt;&lt;span class=&quot;token&quot;&gt; &lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #24292e;&quot;&gt;LD_LIBRARY_PATH&lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #d73a49;&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;token&quot;&gt;/&lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #24292e;&quot;&gt;usr&lt;/span&gt;&lt;span class=&quot;token&quot;&gt;/&lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #24292e;&quot;&gt;local&lt;/span&gt;&lt;span class=&quot;token&quot;&gt;/&lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #24292e;&quot;&gt;cuda&lt;/span&gt;&lt;span class=&quot;token&quot;&gt;/&lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #24292e;&quot;&gt;lib&lt;/span&gt;&lt;span class=&quot;token&quot;&gt;$&lt;/span&gt;&lt;span class=&quot;token&quot;&gt;{&lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #24292e;&quot;&gt;LD_LIBRARY_PATH&lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #d73a49;&quot;&gt;:&lt;/span&gt;&lt;span class=&quot;token&quot;&gt;+&lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #d73a49;&quot;&gt;:&lt;/span&gt;&lt;span class=&quot;token&quot;&gt;$&lt;/span&gt;&lt;span class=&quot;token&quot;&gt;{&lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #24292e;&quot;&gt;LD_LIBRARY_PATH&lt;/span&gt;&lt;span class=&quot;token&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;token&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;token&quot;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;And verify the installation:&lt;/p&gt;
&lt;div x-data=&quot;codeBlock&quot; class=&quot;code-block relative&quot;&gt;&lt;div class=&quot;flex space-x-2 items-center absolute top-0 right-0&quot;&gt;
    &lt;div x-cloak x-show=&quot;showMessage&quot; x-transition class=&quot;py-2 animate-bounce transition duration-300 mt-1 text-sky-500 text-xs&quot;&gt;Copied!&lt;/div&gt;
    &lt;button
        type=&quot;button&quot;
        title=&quot;Copy to clipboard&quot;
        class=&quot;hidden sm:block p-2 pl-3 transition duration-300&quot;
        @click.prevent=&quot;copyToClipboard&quot;
        :class=&quot;{
            'text-black/30 hover:text-black/80': !showMessage,
            'text-sky-500 hover:text-sky-700': showMessage,
        }&quot;&gt;
        &lt;svg xmlns=&quot;http://www.w3.org/2000/svg&quot; fill=&quot;none&quot; viewBox=&quot;0 0 24 24&quot; stroke-width=&quot;1.5&quot; stroke=&quot;currentColor&quot; class=&quot;block w-6 h-6&quot;&gt;
            &lt;path fill=&quot;white&quot; stroke-linecap=&quot;round&quot; stroke-linejoin=&quot;round&quot; d=&quot;M11.35 3.836c-.065.21-.1.433-.1.664 0 .414.336.75.75.75h4.5a.75.75 0 00.75-.75 2.25 2.25 0 00-.1-.664m-5.8 0A2.251 2.251 0 0113.5 2.25H15c1.012 0 1.867.668 2.15 1.586m-5.8 0c-.376.023-.75.05-1.124.08C9.095 4.01 8.25 4.973 8.25 6.108V8.25m8.9-4.414c.376.023.75.05 1.124.08 1.131.094 1.976 1.057 1.976 2.192V16.5A2.25 2.25 0 0118 18.75h-2.25m-7.5-10.5H4.875c-.621 0-1.125.504-1.125 1.125v11.25c0 .621.504 1.125 1.125 1.125h9.75c.621 0 1.125-.504 1.125-1.125V18.75m-7.5-10.5h6.375c.621 0 1.125.504 1.125 1.125v9.375m-8.25-3l1.5 1.5 3-3.75&quot; /&gt;
        &lt;/svg&gt;
    &lt;/button&gt;
&lt;/div&gt;&lt;pre class=&quot;phiki language-shellscript github-light&quot; data-language=&quot;shellscript&quot; style=&quot;background-color: #fff;color: #24292e;&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;token&quot; style=&quot;color: #6f42c1;&quot;&gt;nvcc&lt;/span&gt;&lt;span class=&quot;token&quot;&gt; &lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #005cc5;&quot;&gt;-&lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #005cc5;&quot;&gt;-version&lt;/span&gt;&lt;span class=&quot;token&quot;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;token&quot; style=&quot;color: #6f42c1;&quot;&gt;nvidia-smi&lt;/span&gt;&lt;span class=&quot;token&quot;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;That last command shows the GPU usage and the CUDA version.&lt;/p&gt;
&lt;p&gt;Later you can watch it live with:&lt;/p&gt;
&lt;div x-data=&quot;codeBlock&quot; class=&quot;code-block relative&quot;&gt;&lt;div class=&quot;flex space-x-2 items-center absolute top-0 right-0&quot;&gt;
    &lt;div x-cloak x-show=&quot;showMessage&quot; x-transition class=&quot;py-2 animate-bounce transition duration-300 mt-1 text-sky-500 text-xs&quot;&gt;Copied!&lt;/div&gt;
    &lt;button
        type=&quot;button&quot;
        title=&quot;Copy to clipboard&quot;
        class=&quot;hidden sm:block p-2 pl-3 transition duration-300&quot;
        @click.prevent=&quot;copyToClipboard&quot;
        :class=&quot;{
            'text-black/30 hover:text-black/80': !showMessage,
            'text-sky-500 hover:text-sky-700': showMessage,
        }&quot;&gt;
        &lt;svg xmlns=&quot;http://www.w3.org/2000/svg&quot; fill=&quot;none&quot; viewBox=&quot;0 0 24 24&quot; stroke-width=&quot;1.5&quot; stroke=&quot;currentColor&quot; class=&quot;block w-6 h-6&quot;&gt;
            &lt;path fill=&quot;white&quot; stroke-linecap=&quot;round&quot; stroke-linejoin=&quot;round&quot; d=&quot;M11.35 3.836c-.065.21-.1.433-.1.664 0 .414.336.75.75.75h4.5a.75.75 0 00.75-.75 2.25 2.25 0 00-.1-.664m-5.8 0A2.251 2.251 0 0113.5 2.25H15c1.012 0 1.867.668 2.15 1.586m-5.8 0c-.376.023-.75.05-1.124.08C9.095 4.01 8.25 4.973 8.25 6.108V8.25m8.9-4.414c.376.023.75.05 1.124.08 1.131.094 1.976 1.057 1.976 2.192V16.5A2.25 2.25 0 0118 18.75h-2.25m-7.5-10.5H4.875c-.621 0-1.125.504-1.125 1.125v11.25c0 .621.504 1.125 1.125 1.125h9.75c.621 0 1.125-.504 1.125-1.125V18.75m-7.5-10.5h6.375c.621 0 1.125.504 1.125 1.125v9.375m-8.25-3l1.5 1.5 3-3.75&quot; /&gt;
        &lt;/svg&gt;
    &lt;/button&gt;
&lt;/div&gt;&lt;pre class=&quot;phiki language-shellscript github-light&quot; data-language=&quot;shellscript&quot; style=&quot;background-color: #fff;color: #24292e;&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;token&quot; style=&quot;color: #6f42c1;&quot;&gt;watch&lt;/span&gt;&lt;span class=&quot;token&quot;&gt; &lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #005cc5;&quot;&gt;-&lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #005cc5;&quot;&gt;n&lt;/span&gt;&lt;span class=&quot;token&quot;&gt; &lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #005cc5;&quot;&gt;0.5&lt;/span&gt;&lt;span class=&quot;token&quot;&gt; &lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #032f62;&quot;&gt;nvidia-smi&lt;/span&gt;&lt;span class=&quot;token&quot;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;There is also a command called &lt;code&gt;nvtop&lt;/code&gt; that you can install with:&lt;/p&gt;
&lt;div x-data=&quot;codeBlock&quot; class=&quot;code-block relative&quot;&gt;&lt;div class=&quot;flex space-x-2 items-center absolute top-0 right-0&quot;&gt;
    &lt;div x-cloak x-show=&quot;showMessage&quot; x-transition class=&quot;py-2 animate-bounce transition duration-300 mt-1 text-sky-500 text-xs&quot;&gt;Copied!&lt;/div&gt;
    &lt;button
        type=&quot;button&quot;
        title=&quot;Copy to clipboard&quot;
        class=&quot;hidden sm:block p-2 pl-3 transition duration-300&quot;
        @click.prevent=&quot;copyToClipboard&quot;
        :class=&quot;{
            'text-black/30 hover:text-black/80': !showMessage,
            'text-sky-500 hover:text-sky-700': showMessage,
        }&quot;&gt;
        &lt;svg xmlns=&quot;http://www.w3.org/2000/svg&quot; fill=&quot;none&quot; viewBox=&quot;0 0 24 24&quot; stroke-width=&quot;1.5&quot; stroke=&quot;currentColor&quot; class=&quot;block w-6 h-6&quot;&gt;
            &lt;path fill=&quot;white&quot; stroke-linecap=&quot;round&quot; stroke-linejoin=&quot;round&quot; d=&quot;M11.35 3.836c-.065.21-.1.433-.1.664 0 .414.336.75.75.75h4.5a.75.75 0 00.75-.75 2.25 2.25 0 00-.1-.664m-5.8 0A2.251 2.251 0 0113.5 2.25H15c1.012 0 1.867.668 2.15 1.586m-5.8 0c-.376.023-.75.05-1.124.08C9.095 4.01 8.25 4.973 8.25 6.108V8.25m8.9-4.414c.376.023.75.05 1.124.08 1.131.094 1.976 1.057 1.976 2.192V16.5A2.25 2.25 0 0118 18.75h-2.25m-7.5-10.5H4.875c-.621 0-1.125.504-1.125 1.125v11.25c0 .621.504 1.125 1.125 1.125h9.75c.621 0 1.125-.504 1.125-1.125V18.75m-7.5-10.5h6.375c.621 0 1.125.504 1.125 1.125v9.375m-8.25-3l1.5 1.5 3-3.75&quot; /&gt;
        &lt;/svg&gt;
    &lt;/button&gt;
&lt;/div&gt;&lt;pre class=&quot;phiki language-shellscript github-light&quot; data-language=&quot;shellscript&quot; style=&quot;background-color: #fff;color: #24292e;&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;token&quot; style=&quot;color: #6f42c1;&quot;&gt;sudo&lt;/span&gt;&lt;span class=&quot;token&quot;&gt; &lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #032f62;&quot;&gt;apt-get&lt;/span&gt;&lt;span class=&quot;token&quot;&gt; &lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #032f62;&quot;&gt;install&lt;/span&gt;&lt;span class=&quot;token&quot;&gt; &lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #032f62;&quot;&gt;nvtop&lt;/span&gt;&lt;span class=&quot;token&quot;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;h2&gt;&lt;a id=&quot;content-docker-installation&quot; href=&quot;#content-docker-installation&quot; class=&quot;heading-permalink&quot; aria-hidden=&quot;true&quot; tabindex=&quot;-1&quot; title=&quot;Permalink&quot;&gt;#&lt;/a&gt;Docker Installation&lt;/h2&gt;
&lt;p&gt;For some software that we will use, we need to install Docker.&lt;/p&gt;
&lt;p&gt;Follow the steps detailed in the &lt;a href=&quot;https://docs.docker.com/engine/install/ubuntu/&quot;&gt;Docker installation guide&lt;/a&gt;:&lt;/p&gt;
&lt;p&gt;or copy and paste the following commands:&lt;/p&gt;
&lt;div x-data=&quot;codeBlock&quot; class=&quot;code-block relative&quot;&gt;&lt;div class=&quot;flex space-x-2 items-center absolute top-0 right-0&quot;&gt;
    &lt;div x-cloak x-show=&quot;showMessage&quot; x-transition class=&quot;py-2 animate-bounce transition duration-300 mt-1 text-sky-500 text-xs&quot;&gt;Copied!&lt;/div&gt;
    &lt;button
        type=&quot;button&quot;
        title=&quot;Copy to clipboard&quot;
        class=&quot;hidden sm:block p-2 pl-3 transition duration-300&quot;
        @click.prevent=&quot;copyToClipboard&quot;
        :class=&quot;{
            'text-black/30 hover:text-black/80': !showMessage,
            'text-sky-500 hover:text-sky-700': showMessage,
        }&quot;&gt;
        &lt;svg xmlns=&quot;http://www.w3.org/2000/svg&quot; fill=&quot;none&quot; viewBox=&quot;0 0 24 24&quot; stroke-width=&quot;1.5&quot; stroke=&quot;currentColor&quot; class=&quot;block w-6 h-6&quot;&gt;
            &lt;path fill=&quot;white&quot; stroke-linecap=&quot;round&quot; stroke-linejoin=&quot;round&quot; d=&quot;M11.35 3.836c-.065.21-.1.433-.1.664 0 .414.336.75.75.75h4.5a.75.75 0 00.75-.75 2.25 2.25 0 00-.1-.664m-5.8 0A2.251 2.251 0 0113.5 2.25H15c1.012 0 1.867.668 2.15 1.586m-5.8 0c-.376.023-.75.05-1.124.08C9.095 4.01 8.25 4.973 8.25 6.108V8.25m8.9-4.414c.376.023.75.05 1.124.08 1.131.094 1.976 1.057 1.976 2.192V16.5A2.25 2.25 0 0118 18.75h-2.25m-7.5-10.5H4.875c-.621 0-1.125.504-1.125 1.125v11.25c0 .621.504 1.125 1.125 1.125h9.75c.621 0 1.125-.504 1.125-1.125V18.75m-7.5-10.5h6.375c.621 0 1.125.504 1.125 1.125v9.375m-8.25-3l1.5 1.5 3-3.75&quot; /&gt;
        &lt;/svg&gt;
    &lt;/button&gt;
&lt;/div&gt;&lt;pre class=&quot;phiki language-shellscript github-light&quot; data-language=&quot;shellscript&quot; style=&quot;background-color: #fff;color: #24292e;&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;token&quot; style=&quot;color: #6a737d;&quot;&gt;#&lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #6a737d;&quot;&gt; Add Docker&amp;#039;s official GPG key:
&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;token&quot; style=&quot;color: #6f42c1;&quot;&gt;sudo&lt;/span&gt;&lt;span class=&quot;token&quot;&gt; &lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #032f62;&quot;&gt;apt-get&lt;/span&gt;&lt;span class=&quot;token&quot;&gt; &lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #032f62;&quot;&gt;update&lt;/span&gt;&lt;span class=&quot;token&quot;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;token&quot; style=&quot;color: #6f42c1;&quot;&gt;sudo&lt;/span&gt;&lt;span class=&quot;token&quot;&gt; &lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #032f62;&quot;&gt;apt-get&lt;/span&gt;&lt;span class=&quot;token&quot;&gt; &lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #032f62;&quot;&gt;install&lt;/span&gt;&lt;span class=&quot;token&quot;&gt; &lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #032f62;&quot;&gt;ca-certificates&lt;/span&gt;&lt;span class=&quot;token&quot;&gt; &lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #032f62;&quot;&gt;curl&lt;/span&gt;&lt;span class=&quot;token&quot;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;token&quot; style=&quot;color: #6f42c1;&quot;&gt;sudo&lt;/span&gt;&lt;span class=&quot;token&quot;&gt; &lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #032f62;&quot;&gt;install&lt;/span&gt;&lt;span class=&quot;token&quot;&gt; &lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #005cc5;&quot;&gt;-&lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #005cc5;&quot;&gt;m&lt;/span&gt;&lt;span class=&quot;token&quot;&gt; &lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #005cc5;&quot;&gt;0755&lt;/span&gt;&lt;span class=&quot;token&quot;&gt; &lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #005cc5;&quot;&gt;-&lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #005cc5;&quot;&gt;d&lt;/span&gt;&lt;span class=&quot;token&quot;&gt; &lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #032f62;&quot;&gt;/etc/apt/keyrings&lt;/span&gt;&lt;span class=&quot;token&quot;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;token&quot; style=&quot;color: #6f42c1;&quot;&gt;sudo&lt;/span&gt;&lt;span class=&quot;token&quot;&gt; &lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #032f62;&quot;&gt;curl&lt;/span&gt;&lt;span class=&quot;token&quot;&gt; &lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #005cc5;&quot;&gt;-&lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #005cc5;&quot;&gt;fsSL&lt;/span&gt;&lt;span class=&quot;token&quot;&gt; &lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #032f62;&quot;&gt;https://download.docker.com/linux/ubuntu/gpg&lt;/span&gt;&lt;span class=&quot;token&quot;&gt; &lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #005cc5;&quot;&gt;-&lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #005cc5;&quot;&gt;o&lt;/span&gt;&lt;span class=&quot;token&quot;&gt; &lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #032f62;&quot;&gt;/etc/apt/keyrings/docker.asc&lt;/span&gt;&lt;span class=&quot;token&quot;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;token&quot; style=&quot;color: #6f42c1;&quot;&gt;sudo&lt;/span&gt;&lt;span class=&quot;token&quot;&gt; &lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #032f62;&quot;&gt;chmod&lt;/span&gt;&lt;span class=&quot;token&quot;&gt; &lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #032f62;&quot;&gt;a+r&lt;/span&gt;&lt;span class=&quot;token&quot;&gt; &lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #032f62;&quot;&gt;/etc/apt/keyrings/docker.asc&lt;/span&gt;&lt;span class=&quot;token&quot;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;token&quot;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;token&quot; style=&quot;color: #6a737d;&quot;&gt;#&lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #6a737d;&quot;&gt; Add the repository to Apt sources:
&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;token&quot; style=&quot;color: #005cc5;&quot;&gt;echo&lt;/span&gt;&lt;span class=&quot;token&quot;&gt; &lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #005cc5;&quot;&gt;\
&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;token&quot; style=&quot;color: #032f62;&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #032f62;&quot;&gt;deb [arch=&lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #032f62;&quot;&gt;$(&lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #6f42c1;&quot;&gt;dpkg&lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #032f62;&quot;&gt; &lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #005cc5;&quot;&gt;-&lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #005cc5;&quot;&gt;-print-architecture&lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #032f62;&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #032f62;&quot;&gt; signed-by=/etc/apt/keyrings/docker.asc] https://download.docker.com/linux/ubuntu &lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #005cc5;&quot;&gt;\
&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;token&quot; style=&quot;color: #032f62;&quot;&gt;$(&lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #005cc5;&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #032f62;&quot;&gt; &lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #032f62;&quot;&gt;/etc/os-release&lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #032f62;&quot;&gt; &lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #032f62;&quot;&gt;&amp;amp;&amp;amp;&lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #032f62;&quot;&gt; &lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #005cc5;&quot;&gt;echo&lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #032f62;&quot;&gt; &lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #032f62;&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #032f62;&quot;&gt;$&lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #032f62;&quot;&gt;{&lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #24292e;&quot;&gt;UBUNTU_CODENAME&lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #d73a49;&quot;&gt;:-&lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #24292e;&quot;&gt;$&lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #24292e;&quot;&gt;VERSION_CODENAME&lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #032f62;&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #032f62;&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #032f62;&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #032f62;&quot;&gt; stable&lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #032f62;&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span class=&quot;token&quot;&gt; &lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #d73a49;&quot;&gt;|&lt;/span&gt;&lt;span class=&quot;token&quot;&gt; &lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #005cc5;&quot;&gt;\&lt;/span&gt;&lt;span class=&quot;token&quot;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;token&quot; style=&quot;color: #6f42c1;&quot;&gt;sudo&lt;/span&gt;&lt;span class=&quot;token&quot;&gt; &lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #032f62;&quot;&gt;tee&lt;/span&gt;&lt;span class=&quot;token&quot;&gt; &lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #032f62;&quot;&gt;/etc/apt/sources.list.d/docker.list&lt;/span&gt;&lt;span class=&quot;token&quot;&gt; &lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #d73a49;&quot;&gt;&amp;gt;&lt;/span&gt;&lt;span class=&quot;token&quot;&gt; &lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #032f62;&quot;&gt;/dev/null&lt;/span&gt;&lt;span class=&quot;token&quot;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;token&quot; style=&quot;color: #6f42c1;&quot;&gt;sudo&lt;/span&gt;&lt;span class=&quot;token&quot;&gt; &lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #032f62;&quot;&gt;apt-get&lt;/span&gt;&lt;span class=&quot;token&quot;&gt; &lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #032f62;&quot;&gt;update&lt;/span&gt;&lt;span class=&quot;token&quot;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;token&quot;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;token&quot; style=&quot;color: #6a737d;&quot;&gt;#&lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #6a737d;&quot;&gt; Install Docker
&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;token&quot; style=&quot;color: #6f42c1;&quot;&gt;sudo&lt;/span&gt;&lt;span class=&quot;token&quot;&gt; &lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #032f62;&quot;&gt;apt-get&lt;/span&gt;&lt;span class=&quot;token&quot;&gt; &lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #032f62;&quot;&gt;install&lt;/span&gt;&lt;span class=&quot;token&quot;&gt; &lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #032f62;&quot;&gt;docker-ce&lt;/span&gt;&lt;span class=&quot;token&quot;&gt; &lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #032f62;&quot;&gt;docker-ce-cli&lt;/span&gt;&lt;span class=&quot;token&quot;&gt; &lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #032f62;&quot;&gt;containerd.io&lt;/span&gt;&lt;span class=&quot;token&quot;&gt; &lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #032f62;&quot;&gt;docker-buildx-plugin&lt;/span&gt;&lt;span class=&quot;token&quot;&gt; &lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #032f62;&quot;&gt;docker-compose-plugin&lt;/span&gt;&lt;span class=&quot;token&quot;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;Confirm the installation by running:&lt;/p&gt;
&lt;div x-data=&quot;codeBlock&quot; class=&quot;code-block relative&quot;&gt;&lt;div class=&quot;flex space-x-2 items-center absolute top-0 right-0&quot;&gt;
    &lt;div x-cloak x-show=&quot;showMessage&quot; x-transition class=&quot;py-2 animate-bounce transition duration-300 mt-1 text-sky-500 text-xs&quot;&gt;Copied!&lt;/div&gt;
    &lt;button
        type=&quot;button&quot;
        title=&quot;Copy to clipboard&quot;
        class=&quot;hidden sm:block p-2 pl-3 transition duration-300&quot;
        @click.prevent=&quot;copyToClipboard&quot;
        :class=&quot;{
            'text-black/30 hover:text-black/80': !showMessage,
            'text-sky-500 hover:text-sky-700': showMessage,
        }&quot;&gt;
        &lt;svg xmlns=&quot;http://www.w3.org/2000/svg&quot; fill=&quot;none&quot; viewBox=&quot;0 0 24 24&quot; stroke-width=&quot;1.5&quot; stroke=&quot;currentColor&quot; class=&quot;block w-6 h-6&quot;&gt;
            &lt;path fill=&quot;white&quot; stroke-linecap=&quot;round&quot; stroke-linejoin=&quot;round&quot; d=&quot;M11.35 3.836c-.065.21-.1.433-.1.664 0 .414.336.75.75.75h4.5a.75.75 0 00.75-.75 2.25 2.25 0 00-.1-.664m-5.8 0A2.251 2.251 0 0113.5 2.25H15c1.012 0 1.867.668 2.15 1.586m-5.8 0c-.376.023-.75.05-1.124.08C9.095 4.01 8.25 4.973 8.25 6.108V8.25m8.9-4.414c.376.023.75.05 1.124.08 1.131.094 1.976 1.057 1.976 2.192V16.5A2.25 2.25 0 0118 18.75h-2.25m-7.5-10.5H4.875c-.621 0-1.125.504-1.125 1.125v11.25c0 .621.504 1.125 1.125 1.125h9.75c.621 0 1.125-.504 1.125-1.125V18.75m-7.5-10.5h6.375c.621 0 1.125.504 1.125 1.125v9.375m-8.25-3l1.5 1.5 3-3.75&quot; /&gt;
        &lt;/svg&gt;
    &lt;/button&gt;
&lt;/div&gt;&lt;pre class=&quot;phiki language-shellscript github-light&quot; data-language=&quot;shellscript&quot; style=&quot;background-color: #fff;color: #24292e;&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;token&quot; style=&quot;color: #6f42c1;&quot;&gt;sudo&lt;/span&gt;&lt;span class=&quot;token&quot;&gt; &lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #032f62;&quot;&gt;docker&lt;/span&gt;&lt;span class=&quot;token&quot;&gt; &lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #032f62;&quot;&gt;run&lt;/span&gt;&lt;span class=&quot;token&quot;&gt; &lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #032f62;&quot;&gt;hello-world&lt;/span&gt;&lt;span class=&quot;token&quot;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;h3&gt;&lt;a id=&quot;content-install-nvidia-container-toolkit&quot; href=&quot;#content-install-nvidia-container-toolkit&quot; class=&quot;heading-permalink&quot; aria-hidden=&quot;true&quot; tabindex=&quot;-1&quot; title=&quot;Permalink&quot;&gt;#&lt;/a&gt;Install Nvidia Container Toolkit&lt;/h3&gt;
&lt;p&gt;I don't use Ollama in a Docker container, but you may want to. Or maybe you need to run some other containers that need access to the GPU. This section ensures that you can use the GPU in a container in the future.&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;https://docs.nvidia.com/datacenter/cloud-native/container-toolkit/latest/install-guide.html&quot;&gt;Nvidia container toolkit documentation&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;Follow the instructions for your distribution.&lt;/p&gt;
&lt;h2&gt;&lt;a id=&quot;content-use-ollama-for-running-ai-models&quot; href=&quot;#content-use-ollama-for-running-ai-models&quot; class=&quot;heading-permalink&quot; aria-hidden=&quot;true&quot; tabindex=&quot;-1&quot; title=&quot;Permalink&quot;&gt;#&lt;/a&gt;Use Ollama for running AI models&lt;/h2&gt;
&lt;p&gt;Ollama is a powerful tool for running AI models on your server. It provides a simple command-line interface to run various AI models with ease.&lt;/p&gt;
&lt;p&gt;It also comes with an API that can be used by other applications.&lt;/p&gt;
&lt;p&gt;One feature that I like is that it can distribute the load on multiple GPUs and CPUs. I tried to run models that only use GPU; the rule of thumb is to use models that can fit in the combined memory of all GPUs.&lt;/p&gt;
&lt;p&gt;This is our true AI server.&lt;/p&gt;
&lt;p&gt;I decided to install Ollama directly on the VM, but you can also use a Docker container.&lt;/p&gt;
&lt;p&gt;Install Ollama with the provided script:&lt;/p&gt;
&lt;div x-data=&quot;codeBlock&quot; class=&quot;code-block relative&quot;&gt;&lt;div class=&quot;flex space-x-2 items-center absolute top-0 right-0&quot;&gt;
    &lt;div x-cloak x-show=&quot;showMessage&quot; x-transition class=&quot;py-2 animate-bounce transition duration-300 mt-1 text-sky-500 text-xs&quot;&gt;Copied!&lt;/div&gt;
    &lt;button
        type=&quot;button&quot;
        title=&quot;Copy to clipboard&quot;
        class=&quot;hidden sm:block p-2 pl-3 transition duration-300&quot;
        @click.prevent=&quot;copyToClipboard&quot;
        :class=&quot;{
            'text-black/30 hover:text-black/80': !showMessage,
            'text-sky-500 hover:text-sky-700': showMessage,
        }&quot;&gt;
        &lt;svg xmlns=&quot;http://www.w3.org/2000/svg&quot; fill=&quot;none&quot; viewBox=&quot;0 0 24 24&quot; stroke-width=&quot;1.5&quot; stroke=&quot;currentColor&quot; class=&quot;block w-6 h-6&quot;&gt;
            &lt;path fill=&quot;white&quot; stroke-linecap=&quot;round&quot; stroke-linejoin=&quot;round&quot; d=&quot;M11.35 3.836c-.065.21-.1.433-.1.664 0 .414.336.75.75.75h4.5a.75.75 0 00.75-.75 2.25 2.25 0 00-.1-.664m-5.8 0A2.251 2.251 0 0113.5 2.25H15c1.012 0 1.867.668 2.15 1.586m-5.8 0c-.376.023-.75.05-1.124.08C9.095 4.01 8.25 4.973 8.25 6.108V8.25m8.9-4.414c.376.023.75.05 1.124.08 1.131.094 1.976 1.057 1.976 2.192V16.5A2.25 2.25 0 0118 18.75h-2.25m-7.5-10.5H4.875c-.621 0-1.125.504-1.125 1.125v11.25c0 .621.504 1.125 1.125 1.125h9.75c.621 0 1.125-.504 1.125-1.125V18.75m-7.5-10.5h6.375c.621 0 1.125.504 1.125 1.125v9.375m-8.25-3l1.5 1.5 3-3.75&quot; /&gt;
        &lt;/svg&gt;
    &lt;/button&gt;
&lt;/div&gt;&lt;pre class=&quot;phiki language-shellscript github-light&quot; data-language=&quot;shellscript&quot; style=&quot;background-color: #fff;color: #24292e;&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;token&quot; style=&quot;color: #6f42c1;&quot;&gt;curl&lt;/span&gt;&lt;span class=&quot;token&quot;&gt; &lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #005cc5;&quot;&gt;-&lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #005cc5;&quot;&gt;fsSL&lt;/span&gt;&lt;span class=&quot;token&quot;&gt; &lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #032f62;&quot;&gt;https://ollama.com/install.sh&lt;/span&gt;&lt;span class=&quot;token&quot;&gt; &lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #d73a49;&quot;&gt;|&lt;/span&gt;&lt;span class=&quot;token&quot;&gt; &lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #6f42c1;&quot;&gt;sh&lt;/span&gt;&lt;span class=&quot;token&quot;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;h3&gt;&lt;a id=&quot;content-basic-usage-of-ollama&quot; href=&quot;#content-basic-usage-of-ollama&quot; class=&quot;heading-permalink&quot; aria-hidden=&quot;true&quot; tabindex=&quot;-1&quot; title=&quot;Permalink&quot;&gt;#&lt;/a&gt;Basic Usage of Ollama&lt;/h3&gt;
&lt;p&gt;Run various AI models with commands such as:&lt;/p&gt;
&lt;div x-data=&quot;codeBlock&quot; class=&quot;code-block relative&quot;&gt;&lt;div class=&quot;flex space-x-2 items-center absolute top-0 right-0&quot;&gt;
    &lt;div x-cloak x-show=&quot;showMessage&quot; x-transition class=&quot;py-2 animate-bounce transition duration-300 mt-1 text-sky-500 text-xs&quot;&gt;Copied!&lt;/div&gt;
    &lt;button
        type=&quot;button&quot;
        title=&quot;Copy to clipboard&quot;
        class=&quot;hidden sm:block p-2 pl-3 transition duration-300&quot;
        @click.prevent=&quot;copyToClipboard&quot;
        :class=&quot;{
            'text-black/30 hover:text-black/80': !showMessage,
            'text-sky-500 hover:text-sky-700': showMessage,
        }&quot;&gt;
        &lt;svg xmlns=&quot;http://www.w3.org/2000/svg&quot; fill=&quot;none&quot; viewBox=&quot;0 0 24 24&quot; stroke-width=&quot;1.5&quot; stroke=&quot;currentColor&quot; class=&quot;block w-6 h-6&quot;&gt;
            &lt;path fill=&quot;white&quot; stroke-linecap=&quot;round&quot; stroke-linejoin=&quot;round&quot; d=&quot;M11.35 3.836c-.065.21-.1.433-.1.664 0 .414.336.75.75.75h4.5a.75.75 0 00.75-.75 2.25 2.25 0 00-.1-.664m-5.8 0A2.251 2.251 0 0113.5 2.25H15c1.012 0 1.867.668 2.15 1.586m-5.8 0c-.376.023-.75.05-1.124.08C9.095 4.01 8.25 4.973 8.25 6.108V8.25m8.9-4.414c.376.023.75.05 1.124.08 1.131.094 1.976 1.057 1.976 2.192V16.5A2.25 2.25 0 0118 18.75h-2.25m-7.5-10.5H4.875c-.621 0-1.125.504-1.125 1.125v11.25c0 .621.504 1.125 1.125 1.125h9.75c.621 0 1.125-.504 1.125-1.125V18.75m-7.5-10.5h6.375c.621 0 1.125.504 1.125 1.125v9.375m-8.25-3l1.5 1.5 3-3.75&quot; /&gt;
        &lt;/svg&gt;
    &lt;/button&gt;
&lt;/div&gt;&lt;pre class=&quot;phiki language-shellscript github-light&quot; data-language=&quot;shellscript&quot; style=&quot;background-color: #fff;color: #24292e;&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;token&quot; style=&quot;color: #6f42c1;&quot;&gt;ollama&lt;/span&gt;&lt;span class=&quot;token&quot;&gt; &lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #032f62;&quot;&gt;run&lt;/span&gt;&lt;span class=&quot;token&quot;&gt; &lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #032f62;&quot;&gt;llama3.2&lt;/span&gt;&lt;span class=&quot;token&quot;&gt; &lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #005cc5;&quot;&gt;-&lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #005cc5;&quot;&gt;-verbose&lt;/span&gt;&lt;span class=&quot;token&quot;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;token&quot; style=&quot;color: #6f42c1;&quot;&gt;ollama&lt;/span&gt;&lt;span class=&quot;token&quot;&gt; &lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #032f62;&quot;&gt;run&lt;/span&gt;&lt;span class=&quot;token&quot;&gt; &lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #032f62;&quot;&gt;deepseek-r1:14b&lt;/span&gt;&lt;span class=&quot;token&quot;&gt; &lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #005cc5;&quot;&gt;-&lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #005cc5;&quot;&gt;-verbose&lt;/span&gt;&lt;span class=&quot;token&quot;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;token&quot; style=&quot;color: #6f42c1;&quot;&gt;ollama&lt;/span&gt;&lt;span class=&quot;token&quot;&gt; &lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #032f62;&quot;&gt;run&lt;/span&gt;&lt;span class=&quot;token&quot;&gt; &lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #032f62;&quot;&gt;deepseek-r1:8b&lt;/span&gt;&lt;span class=&quot;token&quot;&gt; &lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #005cc5;&quot;&gt;-&lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #005cc5;&quot;&gt;-verbose&lt;/span&gt;&lt;span class=&quot;token&quot;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;I like to use the &lt;code&gt;--verbose&lt;/code&gt; flag to see stats like &lt;code&gt;tokens per second&lt;/code&gt; and &lt;code&gt;samples per second&lt;/code&gt; after every answer.&lt;/p&gt;
&lt;p&gt;You can also just pull the models without running them:&lt;/p&gt;
&lt;div x-data=&quot;codeBlock&quot; class=&quot;code-block relative&quot;&gt;&lt;div class=&quot;flex space-x-2 items-center absolute top-0 right-0&quot;&gt;
    &lt;div x-cloak x-show=&quot;showMessage&quot; x-transition class=&quot;py-2 animate-bounce transition duration-300 mt-1 text-sky-500 text-xs&quot;&gt;Copied!&lt;/div&gt;
    &lt;button
        type=&quot;button&quot;
        title=&quot;Copy to clipboard&quot;
        class=&quot;hidden sm:block p-2 pl-3 transition duration-300&quot;
        @click.prevent=&quot;copyToClipboard&quot;
        :class=&quot;{
            'text-black/30 hover:text-black/80': !showMessage,
            'text-sky-500 hover:text-sky-700': showMessage,
        }&quot;&gt;
        &lt;svg xmlns=&quot;http://www.w3.org/2000/svg&quot; fill=&quot;none&quot; viewBox=&quot;0 0 24 24&quot; stroke-width=&quot;1.5&quot; stroke=&quot;currentColor&quot; class=&quot;block w-6 h-6&quot;&gt;
            &lt;path fill=&quot;white&quot; stroke-linecap=&quot;round&quot; stroke-linejoin=&quot;round&quot; d=&quot;M11.35 3.836c-.065.21-.1.433-.1.664 0 .414.336.75.75.75h4.5a.75.75 0 00.75-.75 2.25 2.25 0 00-.1-.664m-5.8 0A2.251 2.251 0 0113.5 2.25H15c1.012 0 1.867.668 2.15 1.586m-5.8 0c-.376.023-.75.05-1.124.08C9.095 4.01 8.25 4.973 8.25 6.108V8.25m8.9-4.414c.376.023.75.05 1.124.08 1.131.094 1.976 1.057 1.976 2.192V16.5A2.25 2.25 0 0118 18.75h-2.25m-7.5-10.5H4.875c-.621 0-1.125.504-1.125 1.125v11.25c0 .621.504 1.125 1.125 1.125h9.75c.621 0 1.125-.504 1.125-1.125V18.75m-7.5-10.5h6.375c.621 0 1.125.504 1.125 1.125v9.375m-8.25-3l1.5 1.5 3-3.75&quot; /&gt;
        &lt;/svg&gt;
    &lt;/button&gt;
&lt;/div&gt;&lt;pre class=&quot;phiki language-shellscript github-light&quot; data-language=&quot;shellscript&quot; style=&quot;background-color: #fff;color: #24292e;&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;token&quot; style=&quot;color: #6f42c1;&quot;&gt;ollama&lt;/span&gt;&lt;span class=&quot;token&quot;&gt; &lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #032f62;&quot;&gt;pull&lt;/span&gt;&lt;span class=&quot;token&quot;&gt; &lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #032f62;&quot;&gt;mistral&lt;/span&gt;&lt;span class=&quot;token&quot;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;You can also see how the load is distributed on the GPUs and CPUs with:&lt;/p&gt;
&lt;div x-data=&quot;codeBlock&quot; class=&quot;code-block relative&quot;&gt;&lt;div class=&quot;flex space-x-2 items-center absolute top-0 right-0&quot;&gt;
    &lt;div x-cloak x-show=&quot;showMessage&quot; x-transition class=&quot;py-2 animate-bounce transition duration-300 mt-1 text-sky-500 text-xs&quot;&gt;Copied!&lt;/div&gt;
    &lt;button
        type=&quot;button&quot;
        title=&quot;Copy to clipboard&quot;
        class=&quot;hidden sm:block p-2 pl-3 transition duration-300&quot;
        @click.prevent=&quot;copyToClipboard&quot;
        :class=&quot;{
            'text-black/30 hover:text-black/80': !showMessage,
            'text-sky-500 hover:text-sky-700': showMessage,
        }&quot;&gt;
        &lt;svg xmlns=&quot;http://www.w3.org/2000/svg&quot; fill=&quot;none&quot; viewBox=&quot;0 0 24 24&quot; stroke-width=&quot;1.5&quot; stroke=&quot;currentColor&quot; class=&quot;block w-6 h-6&quot;&gt;
            &lt;path fill=&quot;white&quot; stroke-linecap=&quot;round&quot; stroke-linejoin=&quot;round&quot; d=&quot;M11.35 3.836c-.065.21-.1.433-.1.664 0 .414.336.75.75.75h4.5a.75.75 0 00.75-.75 2.25 2.25 0 00-.1-.664m-5.8 0A2.251 2.251 0 0113.5 2.25H15c1.012 0 1.867.668 2.15 1.586m-5.8 0c-.376.023-.75.05-1.124.08C9.095 4.01 8.25 4.973 8.25 6.108V8.25m8.9-4.414c.376.023.75.05 1.124.08 1.131.094 1.976 1.057 1.976 2.192V16.5A2.25 2.25 0 0118 18.75h-2.25m-7.5-10.5H4.875c-.621 0-1.125.504-1.125 1.125v11.25c0 .621.504 1.125 1.125 1.125h9.75c.621 0 1.125-.504 1.125-1.125V18.75m-7.5-10.5h6.375c.621 0 1.125.504 1.125 1.125v9.375m-8.25-3l1.5 1.5 3-3.75&quot; /&gt;
        &lt;/svg&gt;
    &lt;/button&gt;
&lt;/div&gt;&lt;pre class=&quot;phiki language-shellscript github-light&quot; data-language=&quot;shellscript&quot; style=&quot;background-color: #fff;color: #24292e;&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;token&quot; style=&quot;color: #6f42c1;&quot;&gt;ollama&lt;/span&gt;&lt;span class=&quot;token&quot;&gt; &lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #032f62;&quot;&gt;ps&lt;/span&gt;&lt;span class=&quot;token&quot;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;h3&gt;&lt;a id=&quot;content-make-ollama-listen-outside-of-localhost&quot; href=&quot;#content-make-ollama-listen-outside-of-localhost&quot; class=&quot;heading-permalink&quot; aria-hidden=&quot;true&quot; tabindex=&quot;-1&quot; title=&quot;Permalink&quot;&gt;#&lt;/a&gt;Make Ollama listen outside of localhost&lt;/h3&gt;
&lt;p&gt;This step will be useful if we want our PHPStorm to connect to Ollama.&lt;/p&gt;
&lt;div x-data=&quot;codeBlock&quot; class=&quot;code-block relative&quot;&gt;&lt;div class=&quot;flex space-x-2 items-center absolute top-0 right-0&quot;&gt;
    &lt;div x-cloak x-show=&quot;showMessage&quot; x-transition class=&quot;py-2 animate-bounce transition duration-300 mt-1 text-sky-500 text-xs&quot;&gt;Copied!&lt;/div&gt;
    &lt;button
        type=&quot;button&quot;
        title=&quot;Copy to clipboard&quot;
        class=&quot;hidden sm:block p-2 pl-3 transition duration-300&quot;
        @click.prevent=&quot;copyToClipboard&quot;
        :class=&quot;{
            'text-black/30 hover:text-black/80': !showMessage,
            'text-sky-500 hover:text-sky-700': showMessage,
        }&quot;&gt;
        &lt;svg xmlns=&quot;http://www.w3.org/2000/svg&quot; fill=&quot;none&quot; viewBox=&quot;0 0 24 24&quot; stroke-width=&quot;1.5&quot; stroke=&quot;currentColor&quot; class=&quot;block w-6 h-6&quot;&gt;
            &lt;path fill=&quot;white&quot; stroke-linecap=&quot;round&quot; stroke-linejoin=&quot;round&quot; d=&quot;M11.35 3.836c-.065.21-.1.433-.1.664 0 .414.336.75.75.75h4.5a.75.75 0 00.75-.75 2.25 2.25 0 00-.1-.664m-5.8 0A2.251 2.251 0 0113.5 2.25H15c1.012 0 1.867.668 2.15 1.586m-5.8 0c-.376.023-.75.05-1.124.08C9.095 4.01 8.25 4.973 8.25 6.108V8.25m8.9-4.414c.376.023.75.05 1.124.08 1.131.094 1.976 1.057 1.976 2.192V16.5A2.25 2.25 0 0118 18.75h-2.25m-7.5-10.5H4.875c-.621 0-1.125.504-1.125 1.125v11.25c0 .621.504 1.125 1.125 1.125h9.75c.621 0 1.125-.504 1.125-1.125V18.75m-7.5-10.5h6.375c.621 0 1.125.504 1.125 1.125v9.375m-8.25-3l1.5 1.5 3-3.75&quot; /&gt;
        &lt;/svg&gt;
    &lt;/button&gt;
&lt;/div&gt;&lt;pre class=&quot;phiki language-shellscript github-light&quot; data-language=&quot;shellscript&quot; style=&quot;background-color: #fff;color: #24292e;&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;token&quot; style=&quot;color: #6f42c1;&quot;&gt;systemctl&lt;/span&gt;&lt;span class=&quot;token&quot;&gt; &lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #032f62;&quot;&gt;edit&lt;/span&gt;&lt;span class=&quot;token&quot;&gt; &lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #032f62;&quot;&gt;ollama.service&lt;/span&gt;&lt;span class=&quot;token&quot;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;Add the following lines at the beginning of the file:&lt;/p&gt;
&lt;div x-data=&quot;codeBlock&quot; class=&quot;code-block relative&quot;&gt;&lt;div class=&quot;flex space-x-2 items-center absolute top-0 right-0&quot;&gt;
    &lt;div x-cloak x-show=&quot;showMessage&quot; x-transition class=&quot;py-2 animate-bounce transition duration-300 mt-1 text-sky-500 text-xs&quot;&gt;Copied!&lt;/div&gt;
    &lt;button
        type=&quot;button&quot;
        title=&quot;Copy to clipboard&quot;
        class=&quot;hidden sm:block p-2 pl-3 transition duration-300&quot;
        @click.prevent=&quot;copyToClipboard&quot;
        :class=&quot;{
            'text-black/30 hover:text-black/80': !showMessage,
            'text-sky-500 hover:text-sky-700': showMessage,
        }&quot;&gt;
        &lt;svg xmlns=&quot;http://www.w3.org/2000/svg&quot; fill=&quot;none&quot; viewBox=&quot;0 0 24 24&quot; stroke-width=&quot;1.5&quot; stroke=&quot;currentColor&quot; class=&quot;block w-6 h-6&quot;&gt;
            &lt;path fill=&quot;white&quot; stroke-linecap=&quot;round&quot; stroke-linejoin=&quot;round&quot; d=&quot;M11.35 3.836c-.065.21-.1.433-.1.664 0 .414.336.75.75.75h4.5a.75.75 0 00.75-.75 2.25 2.25 0 00-.1-.664m-5.8 0A2.251 2.251 0 0113.5 2.25H15c1.012 0 1.867.668 2.15 1.586m-5.8 0c-.376.023-.75.05-1.124.08C9.095 4.01 8.25 4.973 8.25 6.108V8.25m8.9-4.414c.376.023.75.05 1.124.08 1.131.094 1.976 1.057 1.976 2.192V16.5A2.25 2.25 0 0118 18.75h-2.25m-7.5-10.5H4.875c-.621 0-1.125.504-1.125 1.125v11.25c0 .621.504 1.125 1.125 1.125h9.75c.621 0 1.125-.504 1.125-1.125V18.75m-7.5-10.5h6.375c.621 0 1.125.504 1.125 1.125v9.375m-8.25-3l1.5 1.5 3-3.75&quot; /&gt;
        &lt;/svg&gt;
    &lt;/button&gt;
&lt;/div&gt;&lt;pre class=&quot;phiki language-shellscript github-light&quot; data-language=&quot;shellscript&quot; style=&quot;background-color: #fff;color: #24292e;&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;token&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;token&quot;&gt;Service&lt;/span&gt;&lt;span class=&quot;token&quot;&gt;]&lt;/span&gt;&lt;span class=&quot;token&quot;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;token&quot; style=&quot;color: #24292e;&quot;&gt;Environment&lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #d73a49;&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #032f62;&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #032f62;&quot;&gt;OLLAMA_HOST=0.0.0.0:11434&lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #032f62;&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span class=&quot;token&quot;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;h2&gt;&lt;a id=&quot;content-openwebui-installation&quot; href=&quot;#content-openwebui-installation&quot; class=&quot;heading-permalink&quot; aria-hidden=&quot;true&quot; tabindex=&quot;-1&quot; title=&quot;Permalink&quot;&gt;#&lt;/a&gt;OpenWebUI Installation&lt;/h2&gt;
&lt;p&gt;OpenWebUI is a web interface that gives you a ChatGPT interface to interact with your AI server.&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;https://github.com/open-webui/open-webui&quot;&gt;OpenWebUI GitHub repository&lt;/a&gt; for detailed installation instructions.&lt;/p&gt;
&lt;p&gt;Here is a quick guide to install OpenWebUI:&lt;/p&gt;
&lt;div x-data=&quot;codeBlock&quot; class=&quot;code-block relative&quot;&gt;&lt;div class=&quot;flex space-x-2 items-center absolute top-0 right-0&quot;&gt;
    &lt;div x-cloak x-show=&quot;showMessage&quot; x-transition class=&quot;py-2 animate-bounce transition duration-300 mt-1 text-sky-500 text-xs&quot;&gt;Copied!&lt;/div&gt;
    &lt;button
        type=&quot;button&quot;
        title=&quot;Copy to clipboard&quot;
        class=&quot;hidden sm:block p-2 pl-3 transition duration-300&quot;
        @click.prevent=&quot;copyToClipboard&quot;
        :class=&quot;{
            'text-black/30 hover:text-black/80': !showMessage,
            'text-sky-500 hover:text-sky-700': showMessage,
        }&quot;&gt;
        &lt;svg xmlns=&quot;http://www.w3.org/2000/svg&quot; fill=&quot;none&quot; viewBox=&quot;0 0 24 24&quot; stroke-width=&quot;1.5&quot; stroke=&quot;currentColor&quot; class=&quot;block w-6 h-6&quot;&gt;
            &lt;path fill=&quot;white&quot; stroke-linecap=&quot;round&quot; stroke-linejoin=&quot;round&quot; d=&quot;M11.35 3.836c-.065.21-.1.433-.1.664 0 .414.336.75.75.75h4.5a.75.75 0 00.75-.75 2.25 2.25 0 00-.1-.664m-5.8 0A2.251 2.251 0 0113.5 2.25H15c1.012 0 1.867.668 2.15 1.586m-5.8 0c-.376.023-.75.05-1.124.08C9.095 4.01 8.25 4.973 8.25 6.108V8.25m8.9-4.414c.376.023.75.05 1.124.08 1.131.094 1.976 1.057 1.976 2.192V16.5A2.25 2.25 0 0118 18.75h-2.25m-7.5-10.5H4.875c-.621 0-1.125.504-1.125 1.125v11.25c0 .621.504 1.125 1.125 1.125h9.75c.621 0 1.125-.504 1.125-1.125V18.75m-7.5-10.5h6.375c.621 0 1.125.504 1.125 1.125v9.375m-8.25-3l1.5 1.5 3-3.75&quot; /&gt;
        &lt;/svg&gt;
    &lt;/button&gt;
&lt;/div&gt;&lt;pre class=&quot;phiki language-shellscript github-light&quot; data-language=&quot;shellscript&quot; style=&quot;background-color: #fff;color: #24292e;&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;token&quot; style=&quot;color: #6f42c1;&quot;&gt;docker&lt;/span&gt;&lt;span class=&quot;token&quot;&gt; &lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #032f62;&quot;&gt;run&lt;/span&gt;&lt;span class=&quot;token&quot;&gt; &lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #005cc5;&quot;&gt;-&lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #005cc5;&quot;&gt;d&lt;/span&gt;&lt;span class=&quot;token&quot;&gt; &lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #005cc5;&quot;&gt;-&lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #005cc5;&quot;&gt;p&lt;/span&gt;&lt;span class=&quot;token&quot;&gt; &lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #032f62;&quot;&gt;3000:8080&lt;/span&gt;&lt;span class=&quot;token&quot;&gt; &lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #005cc5;&quot;&gt;-&lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #005cc5;&quot;&gt;-add-host=host.docker.internal:host-gateway&lt;/span&gt;&lt;span class=&quot;token&quot;&gt; &lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #005cc5;&quot;&gt;-&lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #005cc5;&quot;&gt;v&lt;/span&gt;&lt;span class=&quot;token&quot;&gt; &lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #032f62;&quot;&gt;open-webui:/app/backend/data&lt;/span&gt;&lt;span class=&quot;token&quot;&gt; &lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #005cc5;&quot;&gt;-&lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #005cc5;&quot;&gt;-name&lt;/span&gt;&lt;span class=&quot;token&quot;&gt; &lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #032f62;&quot;&gt;open-webui&lt;/span&gt;&lt;span class=&quot;token&quot;&gt; &lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #005cc5;&quot;&gt;-&lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #005cc5;&quot;&gt;-restart&lt;/span&gt;&lt;span class=&quot;token&quot;&gt; &lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #032f62;&quot;&gt;always&lt;/span&gt;&lt;span class=&quot;token&quot;&gt; &lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #032f62;&quot;&gt;ghcr.io/open-webui/open-webui:main&lt;/span&gt;&lt;span class=&quot;token&quot;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;You can now access OpenWebUI at &lt;code&gt;http://your-server-ip:3000&lt;/code&gt;.&lt;/p&gt;
&lt;p&gt;The first account created will be the admin account.&lt;/p&gt;
&lt;h2&gt;&lt;a id=&quot;content-tailscale&quot; href=&quot;#content-tailscale&quot; class=&quot;heading-permalink&quot; aria-hidden=&quot;true&quot; tabindex=&quot;-1&quot; title=&quot;Permalink&quot;&gt;#&lt;/a&gt;Tailscale&lt;/h2&gt;
&lt;p&gt;Tailscale is your personal VPN that makes it easy to connect your devices through internet without any port forwarding.&lt;/p&gt;
&lt;p&gt;To install Tailscale, the easiest way is to go to your &lt;a href=&quot;https://login.tailscale.com/admin/machines/new-linux&quot;&gt;Tailscale admin console&lt;/a&gt; and get the command to install it on your server.&lt;/p&gt;
&lt;p&gt;Then the next step is to tell Tailscale to serve OpenWebUI:&lt;/p&gt;
&lt;div x-data=&quot;codeBlock&quot; class=&quot;code-block relative&quot;&gt;&lt;div class=&quot;flex space-x-2 items-center absolute top-0 right-0&quot;&gt;
    &lt;div x-cloak x-show=&quot;showMessage&quot; x-transition class=&quot;py-2 animate-bounce transition duration-300 mt-1 text-sky-500 text-xs&quot;&gt;Copied!&lt;/div&gt;
    &lt;button
        type=&quot;button&quot;
        title=&quot;Copy to clipboard&quot;
        class=&quot;hidden sm:block p-2 pl-3 transition duration-300&quot;
        @click.prevent=&quot;copyToClipboard&quot;
        :class=&quot;{
            'text-black/30 hover:text-black/80': !showMessage,
            'text-sky-500 hover:text-sky-700': showMessage,
        }&quot;&gt;
        &lt;svg xmlns=&quot;http://www.w3.org/2000/svg&quot; fill=&quot;none&quot; viewBox=&quot;0 0 24 24&quot; stroke-width=&quot;1.5&quot; stroke=&quot;currentColor&quot; class=&quot;block w-6 h-6&quot;&gt;
            &lt;path fill=&quot;white&quot; stroke-linecap=&quot;round&quot; stroke-linejoin=&quot;round&quot; d=&quot;M11.35 3.836c-.065.21-.1.433-.1.664 0 .414.336.75.75.75h4.5a.75.75 0 00.75-.75 2.25 2.25 0 00-.1-.664m-5.8 0A2.251 2.251 0 0113.5 2.25H15c1.012 0 1.867.668 2.15 1.586m-5.8 0c-.376.023-.75.05-1.124.08C9.095 4.01 8.25 4.973 8.25 6.108V8.25m8.9-4.414c.376.023.75.05 1.124.08 1.131.094 1.976 1.057 1.976 2.192V16.5A2.25 2.25 0 0118 18.75h-2.25m-7.5-10.5H4.875c-.621 0-1.125.504-1.125 1.125v11.25c0 .621.504 1.125 1.125 1.125h9.75c.621 0 1.125-.504 1.125-1.125V18.75m-7.5-10.5h6.375c.621 0 1.125.504 1.125 1.125v9.375m-8.25-3l1.5 1.5 3-3.75&quot; /&gt;
        &lt;/svg&gt;
    &lt;/button&gt;
&lt;/div&gt;&lt;pre class=&quot;phiki language-shellscript github-light&quot; data-language=&quot;shellscript&quot; style=&quot;background-color: #fff;color: #24292e;&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;token&quot; style=&quot;color: #6f42c1;&quot;&gt;sudo&lt;/span&gt;&lt;span class=&quot;token&quot;&gt; &lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #032f62;&quot;&gt;tailscale&lt;/span&gt;&lt;span class=&quot;token&quot;&gt; &lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #032f62;&quot;&gt;serve&lt;/span&gt;&lt;span class=&quot;token&quot;&gt; &lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #005cc5;&quot;&gt;-&lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #005cc5;&quot;&gt;-bg&lt;/span&gt;&lt;span class=&quot;token&quot;&gt; &lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #005cc5;&quot;&gt;3000&lt;/span&gt;&lt;span class=&quot;token&quot;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;You can now access OpenWebUI from anywhere with your Tailscale Magic DNS with HTTPS.&lt;/p&gt;
&lt;p&gt;Example: &lt;code&gt;https://aiserver.tail1234567.ts.net&lt;/code&gt;&lt;/p&gt;
&lt;h2&gt;&lt;a id=&quot;content-phpstorm-integration&quot; href=&quot;#content-phpstorm-integration&quot; class=&quot;heading-permalink&quot; aria-hidden=&quot;true&quot; tabindex=&quot;-1&quot; title=&quot;Permalink&quot;&gt;#&lt;/a&gt;PHPStorm Integration&lt;/h2&gt;
&lt;p&gt;For PHPStorm to connect to Ollama, we need to install the offical PHPStorm AI plugin.&lt;/p&gt;
&lt;p&gt;In the configuration, you can add your Ollama server with the IP and port.&lt;/p&gt;
&lt;h2&gt;&lt;a id=&quot;content-update-ollama-and-openwebui&quot; href=&quot;#content-update-ollama-and-openwebui&quot; class=&quot;heading-permalink&quot; aria-hidden=&quot;true&quot; tabindex=&quot;-1&quot; title=&quot;Permalink&quot;&gt;#&lt;/a&gt;Update Ollama and OpenWebUI&lt;/h2&gt;
&lt;p&gt;To update OpenWebUI automatically, you can use Watchtower.&lt;/p&gt;
&lt;p&gt;Here is a command to update OpenWebUI once:&lt;/p&gt;
&lt;div x-data=&quot;codeBlock&quot; class=&quot;code-block relative&quot;&gt;&lt;div class=&quot;flex space-x-2 items-center absolute top-0 right-0&quot;&gt;
    &lt;div x-cloak x-show=&quot;showMessage&quot; x-transition class=&quot;py-2 animate-bounce transition duration-300 mt-1 text-sky-500 text-xs&quot;&gt;Copied!&lt;/div&gt;
    &lt;button
        type=&quot;button&quot;
        title=&quot;Copy to clipboard&quot;
        class=&quot;hidden sm:block p-2 pl-3 transition duration-300&quot;
        @click.prevent=&quot;copyToClipboard&quot;
        :class=&quot;{
            'text-black/30 hover:text-black/80': !showMessage,
            'text-sky-500 hover:text-sky-700': showMessage,
        }&quot;&gt;
        &lt;svg xmlns=&quot;http://www.w3.org/2000/svg&quot; fill=&quot;none&quot; viewBox=&quot;0 0 24 24&quot; stroke-width=&quot;1.5&quot; stroke=&quot;currentColor&quot; class=&quot;block w-6 h-6&quot;&gt;
            &lt;path fill=&quot;white&quot; stroke-linecap=&quot;round&quot; stroke-linejoin=&quot;round&quot; d=&quot;M11.35 3.836c-.065.21-.1.433-.1.664 0 .414.336.75.75.75h4.5a.75.75 0 00.75-.75 2.25 2.25 0 00-.1-.664m-5.8 0A2.251 2.251 0 0113.5 2.25H15c1.012 0 1.867.668 2.15 1.586m-5.8 0c-.376.023-.75.05-1.124.08C9.095 4.01 8.25 4.973 8.25 6.108V8.25m8.9-4.414c.376.023.75.05 1.124.08 1.131.094 1.976 1.057 1.976 2.192V16.5A2.25 2.25 0 0118 18.75h-2.25m-7.5-10.5H4.875c-.621 0-1.125.504-1.125 1.125v11.25c0 .621.504 1.125 1.125 1.125h9.75c.621 0 1.125-.504 1.125-1.125V18.75m-7.5-10.5h6.375c.621 0 1.125.504 1.125 1.125v9.375m-8.25-3l1.5 1.5 3-3.75&quot; /&gt;
        &lt;/svg&gt;
    &lt;/button&gt;
&lt;/div&gt;&lt;pre class=&quot;phiki language-shellscript github-light&quot; data-language=&quot;shellscript&quot; style=&quot;background-color: #fff;color: #24292e;&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;token&quot; style=&quot;color: #6f42c1;&quot;&gt;sudo&lt;/span&gt;&lt;span class=&quot;token&quot;&gt; &lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #032f62;&quot;&gt;docker&lt;/span&gt;&lt;span class=&quot;token&quot;&gt; &lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #032f62;&quot;&gt;run&lt;/span&gt;&lt;span class=&quot;token&quot;&gt; &lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #005cc5;&quot;&gt;-&lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #005cc5;&quot;&gt;-rm&lt;/span&gt;&lt;span class=&quot;token&quot;&gt; &lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #005cc5;&quot;&gt;-&lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #005cc5;&quot;&gt;-volume&lt;/span&gt;&lt;span class=&quot;token&quot;&gt; &lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #032f62;&quot;&gt;/var/run/docker.sock:/var/run/docker.sock&lt;/span&gt;&lt;span class=&quot;token&quot;&gt; &lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #032f62;&quot;&gt;containrrr/watchtower&lt;/span&gt;&lt;span class=&quot;token&quot;&gt; &lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #005cc5;&quot;&gt;-&lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #005cc5;&quot;&gt;-run-once&lt;/span&gt;&lt;span class=&quot;token&quot;&gt; &lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #032f62;&quot;&gt;open-webui&lt;/span&gt;&lt;span class=&quot;token&quot;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;And here is a command to update OpenWebUI every hour:&lt;/p&gt;
&lt;div x-data=&quot;codeBlock&quot; class=&quot;code-block relative&quot;&gt;&lt;div class=&quot;flex space-x-2 items-center absolute top-0 right-0&quot;&gt;
    &lt;div x-cloak x-show=&quot;showMessage&quot; x-transition class=&quot;py-2 animate-bounce transition duration-300 mt-1 text-sky-500 text-xs&quot;&gt;Copied!&lt;/div&gt;
    &lt;button
        type=&quot;button&quot;
        title=&quot;Copy to clipboard&quot;
        class=&quot;hidden sm:block p-2 pl-3 transition duration-300&quot;
        @click.prevent=&quot;copyToClipboard&quot;
        :class=&quot;{
            'text-black/30 hover:text-black/80': !showMessage,
            'text-sky-500 hover:text-sky-700': showMessage,
        }&quot;&gt;
        &lt;svg xmlns=&quot;http://www.w3.org/2000/svg&quot; fill=&quot;none&quot; viewBox=&quot;0 0 24 24&quot; stroke-width=&quot;1.5&quot; stroke=&quot;currentColor&quot; class=&quot;block w-6 h-6&quot;&gt;
            &lt;path fill=&quot;white&quot; stroke-linecap=&quot;round&quot; stroke-linejoin=&quot;round&quot; d=&quot;M11.35 3.836c-.065.21-.1.433-.1.664 0 .414.336.75.75.75h4.5a.75.75 0 00.75-.75 2.25 2.25 0 00-.1-.664m-5.8 0A2.251 2.251 0 0113.5 2.25H15c1.012 0 1.867.668 2.15 1.586m-5.8 0c-.376.023-.75.05-1.124.08C9.095 4.01 8.25 4.973 8.25 6.108V8.25m8.9-4.414c.376.023.75.05 1.124.08 1.131.094 1.976 1.057 1.976 2.192V16.5A2.25 2.25 0 0118 18.75h-2.25m-7.5-10.5H4.875c-.621 0-1.125.504-1.125 1.125v11.25c0 .621.504 1.125 1.125 1.125h9.75c.621 0 1.125-.504 1.125-1.125V18.75m-7.5-10.5h6.375c.621 0 1.125.504 1.125 1.125v9.375m-8.25-3l1.5 1.5 3-3.75&quot; /&gt;
        &lt;/svg&gt;
    &lt;/button&gt;
&lt;/div&gt;&lt;pre class=&quot;phiki language-shellscript github-light&quot; data-language=&quot;shellscript&quot; style=&quot;background-color: #fff;color: #24292e;&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;token&quot; style=&quot;color: #6f42c1;&quot;&gt;sudo&lt;/span&gt;&lt;span class=&quot;token&quot;&gt; &lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #032f62;&quot;&gt;docker&lt;/span&gt;&lt;span class=&quot;token&quot;&gt; &lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #032f62;&quot;&gt;run&lt;/span&gt;&lt;span class=&quot;token&quot;&gt; &lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #005cc5;&quot;&gt;-&lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #005cc5;&quot;&gt;d&lt;/span&gt;&lt;span class=&quot;token&quot;&gt; &lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #005cc5;&quot;&gt;\
&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;token&quot;&gt;--restart&lt;/span&gt;&lt;span class=&quot;token&quot;&gt; &lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #032f62;&quot;&gt;always&lt;/span&gt;&lt;span class=&quot;token&quot;&gt; &lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #005cc5;&quot;&gt;\
&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;token&quot;&gt;--volume&lt;/span&gt;&lt;span class=&quot;token&quot;&gt; &lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #032f62;&quot;&gt;/var/run/docker.sock:/var/run/docker.sock&lt;/span&gt;&lt;span class=&quot;token&quot;&gt; &lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #005cc5;&quot;&gt;\
&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;token&quot;&gt;containrrr/watchtower&lt;/span&gt;&lt;span class=&quot;token&quot;&gt; &lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #005cc5;&quot;&gt;-&lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #005cc5;&quot;&gt;-interval&lt;/span&gt;&lt;span class=&quot;token&quot;&gt; &lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #005cc5;&quot;&gt;3600&lt;/span&gt;&lt;span class=&quot;token&quot;&gt; &lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #032f62;&quot;&gt;open-webui&lt;/span&gt;&lt;span class=&quot;token&quot;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;The only way to update Ollama is to run the install script again.&lt;/p&gt;
&lt;p&gt;Here is a command to update Ollama every week:&lt;/p&gt;
&lt;div x-data=&quot;codeBlock&quot; class=&quot;code-block relative&quot;&gt;&lt;div class=&quot;flex space-x-2 items-center absolute top-0 right-0&quot;&gt;
    &lt;div x-cloak x-show=&quot;showMessage&quot; x-transition class=&quot;py-2 animate-bounce transition duration-300 mt-1 text-sky-500 text-xs&quot;&gt;Copied!&lt;/div&gt;
    &lt;button
        type=&quot;button&quot;
        title=&quot;Copy to clipboard&quot;
        class=&quot;hidden sm:block p-2 pl-3 transition duration-300&quot;
        @click.prevent=&quot;copyToClipboard&quot;
        :class=&quot;{
            'text-black/30 hover:text-black/80': !showMessage,
            'text-sky-500 hover:text-sky-700': showMessage,
        }&quot;&gt;
        &lt;svg xmlns=&quot;http://www.w3.org/2000/svg&quot; fill=&quot;none&quot; viewBox=&quot;0 0 24 24&quot; stroke-width=&quot;1.5&quot; stroke=&quot;currentColor&quot; class=&quot;block w-6 h-6&quot;&gt;
            &lt;path fill=&quot;white&quot; stroke-linecap=&quot;round&quot; stroke-linejoin=&quot;round&quot; d=&quot;M11.35 3.836c-.065.21-.1.433-.1.664 0 .414.336.75.75.75h4.5a.75.75 0 00.75-.75 2.25 2.25 0 00-.1-.664m-5.8 0A2.251 2.251 0 0113.5 2.25H15c1.012 0 1.867.668 2.15 1.586m-5.8 0c-.376.023-.75.05-1.124.08C9.095 4.01 8.25 4.973 8.25 6.108V8.25m8.9-4.414c.376.023.75.05 1.124.08 1.131.094 1.976 1.057 1.976 2.192V16.5A2.25 2.25 0 0118 18.75h-2.25m-7.5-10.5H4.875c-.621 0-1.125.504-1.125 1.125v11.25c0 .621.504 1.125 1.125 1.125h9.75c.621 0 1.125-.504 1.125-1.125V18.75m-7.5-10.5h6.375c.621 0 1.125.504 1.125 1.125v9.375m-8.25-3l1.5 1.5 3-3.75&quot; /&gt;
        &lt;/svg&gt;
    &lt;/button&gt;
&lt;/div&gt;&lt;pre class=&quot;phiki language-shellscript github-light&quot; data-language=&quot;shellscript&quot; style=&quot;background-color: #fff;color: #24292e;&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;token&quot; style=&quot;color: #6f42c1;&quot;&gt;sudo&lt;/span&gt;&lt;span class=&quot;token&quot;&gt; &lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #032f62;&quot;&gt;crontab&lt;/span&gt;&lt;span class=&quot;token&quot;&gt; &lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #005cc5;&quot;&gt;-&lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #005cc5;&quot;&gt;e&lt;/span&gt;&lt;span class=&quot;token&quot;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;Add the following line to the file:&lt;/p&gt;
&lt;div x-data=&quot;codeBlock&quot; class=&quot;code-block relative&quot;&gt;&lt;div class=&quot;flex space-x-2 items-center absolute top-0 right-0&quot;&gt;
    &lt;div x-cloak x-show=&quot;showMessage&quot; x-transition class=&quot;py-2 animate-bounce transition duration-300 mt-1 text-sky-500 text-xs&quot;&gt;Copied!&lt;/div&gt;
    &lt;button
        type=&quot;button&quot;
        title=&quot;Copy to clipboard&quot;
        class=&quot;hidden sm:block p-2 pl-3 transition duration-300&quot;
        @click.prevent=&quot;copyToClipboard&quot;
        :class=&quot;{
            'text-black/30 hover:text-black/80': !showMessage,
            'text-sky-500 hover:text-sky-700': showMessage,
        }&quot;&gt;
        &lt;svg xmlns=&quot;http://www.w3.org/2000/svg&quot; fill=&quot;none&quot; viewBox=&quot;0 0 24 24&quot; stroke-width=&quot;1.5&quot; stroke=&quot;currentColor&quot; class=&quot;block w-6 h-6&quot;&gt;
            &lt;path fill=&quot;white&quot; stroke-linecap=&quot;round&quot; stroke-linejoin=&quot;round&quot; d=&quot;M11.35 3.836c-.065.21-.1.433-.1.664 0 .414.336.75.75.75h4.5a.75.75 0 00.75-.75 2.25 2.25 0 00-.1-.664m-5.8 0A2.251 2.251 0 0113.5 2.25H15c1.012 0 1.867.668 2.15 1.586m-5.8 0c-.376.023-.75.05-1.124.08C9.095 4.01 8.25 4.973 8.25 6.108V8.25m8.9-4.414c.376.023.75.05 1.124.08 1.131.094 1.976 1.057 1.976 2.192V16.5A2.25 2.25 0 0118 18.75h-2.25m-7.5-10.5H4.875c-.621 0-1.125.504-1.125 1.125v11.25c0 .621.504 1.125 1.125 1.125h9.75c.621 0 1.125-.504 1.125-1.125V18.75m-7.5-10.5h6.375c.621 0 1.125.504 1.125 1.125v9.375m-8.25-3l1.5 1.5 3-3.75&quot; /&gt;
        &lt;/svg&gt;
    &lt;/button&gt;
&lt;/div&gt;&lt;pre class=&quot;phiki language-shellscript github-light&quot; data-language=&quot;shellscript&quot; style=&quot;background-color: #fff;color: #24292e;&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;token&quot;&gt;0&lt;/span&gt;&lt;span class=&quot;token&quot;&gt; &lt;/span&gt;&lt;span class=&quot;token&quot;&gt;0&lt;/span&gt;&lt;span class=&quot;token&quot;&gt; &lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #005cc5;&quot;&gt;*&lt;/span&gt;&lt;span class=&quot;token&quot;&gt; &lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #005cc5;&quot;&gt;*&lt;/span&gt;&lt;span class=&quot;token&quot;&gt; &lt;/span&gt;&lt;span class=&quot;token&quot;&gt;0&lt;/span&gt;&lt;span class=&quot;token&quot;&gt; &lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #032f62;&quot;&gt;curl&lt;/span&gt;&lt;span class=&quot;token&quot;&gt; &lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #005cc5;&quot;&gt;-&lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #005cc5;&quot;&gt;fsSL&lt;/span&gt;&lt;span class=&quot;token&quot;&gt; &lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #032f62;&quot;&gt;https://ollama.com/install.sh&lt;/span&gt;&lt;span class=&quot;token&quot;&gt; &lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #d73a49;&quot;&gt;|&lt;/span&gt;&lt;span class=&quot;token&quot;&gt; &lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #6f42c1;&quot;&gt;sh&lt;/span&gt;&lt;span class=&quot;token&quot;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;h2&gt;&lt;a id=&quot;content-conclusion&quot; href=&quot;#content-conclusion&quot; class=&quot;heading-permalink&quot; aria-hidden=&quot;true&quot; tabindex=&quot;-1&quot; title=&quot;Permalink&quot;&gt;#&lt;/a&gt;Conclusion&lt;/h2&gt;
&lt;p&gt;And voilà!&lt;/p&gt;
&lt;p&gt;You now have a personal AI server that you can access from anywhere with PHPStorm and OpenWebUI.&lt;/p&gt;
&lt;p&gt;You should dig into the documentation of Ollama and OpenWebUI to see all the features they offer.&lt;/p&gt;
&lt;p&gt;Examples of advanced features you can explore:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Image generation&lt;/li&gt;
&lt;li&gt;Indexing documents with embeddings&lt;/li&gt;
&lt;li&gt;Chat with ChatGPT and local models at the same time&lt;/li&gt;
&lt;li&gt;Use multi modal models like &lt;code&gt;llama3.2-vision&lt;/code&gt;&lt;/li&gt;
&lt;/ul&gt;</content>
        <author>
            <name>Eser DENIZ</name>
        </author>
    </entry>
    <entry>
        <title type="text">2024 : Year in review</title>
        <link href="https://srwiez.com/posts/2024-year-in-review"/>
        <id>https://srwiez.com/posts/2024-year-in-review</id>
        <published>2024-12-27T00:00:00+00:00</published>
        <updated>2024-12-27T17:27:55+00:00</updated>
        <summary type="text">&lt;p&gt;I definitely have not followed all my wishes from &lt;a href=&quot;https://srwiez.com/posts/2023-year-in-review&quot;&gt;last year&lt;/a&gt;, but who does? This year was my 30th year on this big rock, and it marked a turn, more than I thought it would.&lt;/p&gt;
&lt;!--more--&gt;
&lt;ul class=&quot;table-of-contents not-prose&quot;&gt;
&lt;li&gt;&lt;a href=&quot;#content-traveled-a-lot&quot;&gt;Traveled a lot&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;#content-started-my-own-company&quot;&gt;Started my own company&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;#content-wrote-a-lot-more&quot;&gt;Wrote a lot more&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;#content-i-got-payed-for-open-source-work&quot;&gt;I got payed for Open Source work&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;#content-now-im-poor&quot;&gt;Now I'm poor&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;#content-but-somehow-happy&quot;&gt;But somehow happy&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;#content-whats-next-then&quot;&gt;What's next then?&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;&lt;a id=&quot;content-traveled-a-lot&quot; href=&quot;#content-traveled-a-lot&quot; class=&quot;heading-permalink&quot; aria-hidden=&quot;true&quot; tabindex=&quot;-1&quot; title=&quot;Permalink&quot;&gt;#&lt;/a&gt;Traveled a lot&lt;/h2&gt;
&lt;p&gt;If you don't know, I'm living in a van.&lt;/p&gt;
&lt;p&gt;I converted it myself and traveled through Western Europe.&lt;/p&gt;
&lt;p&gt;But not much this year because I had some paperwork to do, and it took me 9 months to get through.&lt;/p&gt;
&lt;p&gt;I still traveled a lot, though:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;January started strong: one awesome &lt;strong&gt;ski trip&lt;/strong&gt; with my friends ⛷️&lt;/li&gt;
&lt;li&gt;In February, I attended &lt;strong&gt;Laracon EU&lt;/strong&gt; in Amsterdam!&lt;/li&gt;
&lt;li&gt;In February, I also spent a week in &lt;strong&gt;Copenhagen&lt;/strong&gt; with my friends.&lt;/li&gt;
&lt;li&gt;March: another &lt;strong&gt;ski trip&lt;/strong&gt; with my cousins! ⛷️ I'm addicted!&lt;/li&gt;
&lt;li&gt;May and June: &lt;strong&gt;Festival&lt;/strong&gt; 🎶 !&lt;/li&gt;
&lt;li&gt;In July, we had the &lt;strong&gt;Olympics in Paris&lt;/strong&gt;. It was fun to watch, follow, and attend too. Really good vibes. Surprised.&lt;/li&gt;
&lt;li&gt;In August, I threw &lt;strong&gt;a big party&lt;/strong&gt; for my 30th birthday!&lt;/li&gt;
&lt;li&gt;In October, I spent two weeks in &lt;strong&gt;Turkey&lt;/strong&gt;.&lt;/li&gt;
&lt;li&gt;In November, I traveled in my van in the &lt;strong&gt;south of France&lt;/strong&gt;.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;I thought I didn't do much this year, but looking back at my photos:&lt;br /&gt;
I had a pretty good year of travels.&lt;/p&gt;
&lt;p&gt;Also, that's the trick for your yearly review:&lt;br /&gt;
Take your phone and look back at your photos.&lt;/p&gt;
&lt;h2&gt;&lt;a id=&quot;content-started-my-own-company&quot; href=&quot;#content-started-my-own-company&quot; class=&quot;heading-permalink&quot; aria-hidden=&quot;true&quot; tabindex=&quot;-1&quot; title=&quot;Permalink&quot;&gt;#&lt;/a&gt;Started my own company&lt;/h2&gt;
&lt;p&gt;I started a SaaS. Every developer's dream, right?&lt;/p&gt;
&lt;p&gt;Well, this year, I realized mine. I launched the first version of &lt;a href=&quot;https://unolia.com/?utm_source=srwiez.com&amp;amp;utm_medium=blog&amp;amp;utm_campaign=yearly-review&quot;&gt;unolia.com&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;After being at Laracon EU, I made the decision to finally start working on my big idea. I wanted a proof of concept live as fast as possible, so the first three months were very productive. I limited my product to the basics I would need: connecting every major domain provider.&lt;/p&gt;
&lt;p&gt;And in June, an open beta was online!&lt;/p&gt;
&lt;p&gt;This is not even 1/5 of the ideas I had in mind. I knew I would need to break the project down into reachable goals, so I started with domains. But the ultimate goal is to connect every service you have and write automation between them.&lt;/p&gt;
&lt;p&gt;Then... I don't know, it slowed down. I worked on it every month, but not enough.&lt;/p&gt;
&lt;p&gt;In October, I took a week to write actual marketing content.&lt;/p&gt;
&lt;p&gt;And in November, I integrated Stripe, and it's now a paid product.&lt;/p&gt;
&lt;p&gt;I made myself a promise to work at least 1 complete year on it to give it a chance.&lt;/p&gt;
&lt;p&gt;I think now that it needs 2 years because of what I see from other similar stories and also because I don't think I worked enough on it this year.&lt;/p&gt;
&lt;p&gt;Coding a SaaS is &lt;strong&gt;not hard&lt;/strong&gt;, creating a design can be fun, doing marketing is interesting, and even creating a legal structure is okay.&lt;/p&gt;
&lt;p&gt;But doing it all at the same time... boy oh boy, it's &lt;strong&gt;exhausting&lt;/strong&gt;.&lt;/p&gt;
&lt;h2&gt;&lt;a id=&quot;content-wrote-a-lot-more&quot; href=&quot;#content-wrote-a-lot-more&quot; class=&quot;heading-permalink&quot; aria-hidden=&quot;true&quot; tabindex=&quot;-1&quot; title=&quot;Permalink&quot;&gt;#&lt;/a&gt;Wrote a lot more&lt;/h2&gt;
&lt;p&gt;Last year, I published 8 articles here, well 9 with this one.&lt;/p&gt;
&lt;p&gt;I want to double that this year.&lt;/p&gt;
&lt;p&gt;I love writing. I write a lot in my bed at the end of the day or on a public bench after long hours of driving. Even writing documentation for my code and projects, I just love it.&lt;/p&gt;
&lt;p&gt;I secretly hope to write a book someday.&lt;/p&gt;
&lt;p&gt;I feel like I'm better at writing in English, and I'm also better at writing in French. I write my adventures in my notes, and sometimes I even make rhymes for the fun of it.&lt;/p&gt;
&lt;p&gt;I also tweeted more.&lt;/p&gt;
&lt;p&gt;This led me to be more visible on social networks and slowly built an audience.&lt;/p&gt;
&lt;h2&gt;&lt;a id=&quot;content-i-got-payed-for-open-source-work&quot; href=&quot;#content-i-got-payed-for-open-source-work&quot; class=&quot;heading-permalink&quot; aria-hidden=&quot;true&quot; tabindex=&quot;-1&quot; title=&quot;Permalink&quot;&gt;#&lt;/a&gt;I got payed for Open Source work&lt;/h2&gt;
&lt;p&gt;Last year, I published 4 open-source projects. This year, &lt;a href=&quot;https://srwiez.com/open-source?utm_source=srwiez.com&amp;amp;utm_medium=blog&amp;amp;utm_campaign=yearly-review&quot;&gt;8 more&lt;/a&gt;!&lt;/p&gt;
&lt;p&gt;I like sharing, writing a good API, and creating beautiful READMEs. If I have a coding problem, I'll create a solution for it. It's a good exercise, and it's gratifying because when it's done, it's done (unlike big projects).&lt;/p&gt;
&lt;p&gt;Yes, I know that after that, there is some maintenance and updates involved, but so far, I'm enjoying that too.&lt;/p&gt;
&lt;center&gt;
  &lt;a href=&quot;https://assets.srwiez.com/2024-review/git-wrapped-srwiez-2024.png&quot; title=&quot;Git Wrapped 2024&quot;&gt;
&lt;img src=&quot;https://assets.srwiez.com/2024-review/git-wrapped-srwiez-2024.png&quot; alt=&quot;Git Wrapped 2024&quot; width=&quot;65%&quot; classes=&quot;object-cover mx-auto&quot; /&gt;
    &lt;/a&gt;
&lt;/center&gt;
&lt;p&gt;I don't make any money off it. It was never the goal.&lt;/p&gt;
&lt;p&gt;BUT I still earned some money!&lt;/p&gt;
&lt;p&gt;Not on my own project, but on NativePHP. Simon reached out to me and wanted to thank me for some of my PRs on the &lt;a href=&quot;https://nativephp.com/?utm_source=srwiez.com&amp;amp;utm_medium=blog&amp;amp;utm_campaign=yearly-review&quot;&gt;nativephp.com&lt;/a&gt; website.&lt;/p&gt;
&lt;p&gt;I accepted, and shortly after, I had 250€ in my account.&lt;/p&gt;
&lt;p&gt;I was &lt;strong&gt;honored&lt;/strong&gt; and &lt;strong&gt;surprised&lt;/strong&gt;.&lt;/p&gt;
&lt;p&gt;It made me so &lt;strong&gt;happy&lt;/strong&gt;! I told all my friends, even though half of my friends didn't understand what open source is.&lt;/p&gt;
&lt;p&gt;I should have cried out loud on Twitter too. But I wasn't sure if I should. I hadn't been in this situation before. A &amp;quot;stranger&amp;quot; giving me money for something I happily did for free. Still today, I don't know why I kept it silent.&lt;/p&gt;
&lt;p&gt;Because I think it's a movement we have to support. Open-source shouldn't mean free. We're helping each other. It's only fair to help each other financially too.&lt;/p&gt;
&lt;p&gt;And everyone should know how awesome &lt;a href=&quot;https://simonhamp.me/?utm_source=srwiez.com&amp;amp;utm_medium=blog&amp;amp;utm_campaign=yearly-review&quot;&gt;Simon&lt;/a&gt; is. He's just a good guy. I believe in him, and I hope that he will succeed in every project he decides to go after next year.&lt;/p&gt;
&lt;p&gt;I wanna do more open-source, I'm good at it.&lt;/p&gt;
&lt;h2&gt;&lt;a id=&quot;content-now-im-poor&quot; href=&quot;#content-now-im-poor&quot; class=&quot;heading-permalink&quot; aria-hidden=&quot;true&quot; tabindex=&quot;-1&quot; title=&quot;Permalink&quot;&gt;#&lt;/a&gt;Now I'm poor&lt;/h2&gt;
&lt;p&gt;Talking about Money, I never been so low.&lt;/p&gt;
&lt;p&gt;All my savings are gone.&lt;/p&gt;
&lt;p&gt;It's been almost 3 years since I've been unemployed.&lt;br /&gt;
I took 2 years to travel and 1 year to discover who I am and what I want.&lt;/p&gt;
&lt;p&gt;Quite a long pause you may say but for the outcome, it was worth it.&lt;br /&gt;
(you'll see next chapter)&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;In November: I had barely enough money to drive back to my hometown.&lt;/li&gt;
&lt;li&gt;Mid December: Don't have enough to pays my insurances.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;I should be at the bottom of a pit being eaten by anxiety.&lt;/p&gt;
&lt;p&gt;In fact, I almost fell into it.&lt;/p&gt;
&lt;p&gt;But I did see it coming one evening. From my bed, I woke up again. And made a list of all my expenses and earnings. Gone through all my accounts, savings, everything.&lt;/p&gt;
&lt;p&gt;The result was.. &lt;strong&gt;concerning&lt;/strong&gt; to say the least.&lt;/p&gt;
&lt;p&gt;But at least I stopped burying my head in the sand and I had a short-term plan.&lt;/p&gt;
&lt;p&gt;So I sold some unused hardware.&lt;br /&gt;
And later, all my remaining cryptocurrencies.&lt;br /&gt;
I won a little amount of money here and there.&lt;/p&gt;
&lt;p&gt;By my estimations, I can live until mid-February. Then... well, I don't know.&lt;/p&gt;
&lt;p&gt;I started searching for short missions and peeked at some real jobs, but I don't want to go back to any company. I can't handle having a boss anymore. I want partners. I only want to work with people I could eat lunch with every day (in the sense that I like them).&lt;/p&gt;
&lt;p&gt;Having no money has been &amp;quot;good.&amp;quot;&lt;/p&gt;
&lt;p&gt;Living in a van taught me how valuable water, hot water, electricity, and comfort are.&lt;/p&gt;
&lt;p&gt;Being poor taught me how to live with a minimum amount. With my current way of life, I could work on open source all day, every day, for just about ~2000 € per month (before taxes 😅).&lt;/p&gt;
&lt;p&gt;Of course, I want more. Just look back at every trip I've taken last year.&lt;/p&gt;
&lt;p&gt;But at least I know how to live with less now.&lt;/p&gt;
&lt;p&gt;This is now my new minimum I have to achieve.&lt;/p&gt;
&lt;h2&gt;&lt;a id=&quot;content-but-somehow-happy&quot; href=&quot;#content-but-somehow-happy&quot; class=&quot;heading-permalink&quot; aria-hidden=&quot;true&quot; tabindex=&quot;-1&quot; title=&quot;Permalink&quot;&gt;#&lt;/a&gt;But somehow happy&lt;/h2&gt;
&lt;p&gt;The thing is, I think I finally found how I want to live this life.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Far less alcohol (and drugs)&lt;/strong&gt;&lt;br /&gt;
I used to say that alcohol has no effect on me. And yes, I can drink a considerable amount before losing control. But I also discovered that it was one of the culprits for my degraded health. I don't want to be drunk anymore, even for a good party or a big festival. Life is short; I don't want to waste any days by being hungover. I feel like I'm too old for this. It was fun, but now my body is taking too long to recover.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Live outside&lt;/strong&gt;&lt;br /&gt;
Ok, obviously I don't want to live in a van for the rest of my life. But I like being in contact with nature. If I can, I would continue to travel, go backpacking, and cycle. But the ultimate goal is to have enough money to buy land, have a tiny house, and a garden. Programming with a view.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Focus on myself&lt;/strong&gt;&lt;br /&gt;
I'm done doing things for the love of others. I don't want to be defined by others. I don't want to please anyone. It seems extreme said like this, but I hurt myself a lot just to find someone to love me back. I have made peace with myself. I'm okay being alone most of the time.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Doing what I love&lt;/strong&gt;&lt;br /&gt;
I love tinkering. That's what makes me happy. Domotizing a house, upgrading a car, converting a van, and making web, CLI, and desktop apps are some of the things I have made in the last 3 years, and I absolutely loved doing them. When I was younger, I said that I wanted to be an inventor. And look mom, I did become one!&lt;/p&gt;
&lt;h2&gt;&lt;a id=&quot;content-whats-next-then&quot; href=&quot;#content-whats-next-then&quot; class=&quot;heading-permalink&quot; aria-hidden=&quot;true&quot; tabindex=&quot;-1&quot; title=&quot;Permalink&quot;&gt;#&lt;/a&gt;What's next then?&lt;/h2&gt;
&lt;p&gt;Last year I had money but I wasn't really happy.&lt;br /&gt;
This year I'm happy but I don't have any money.&lt;/p&gt;
&lt;p&gt;Funny how the life works, huh.&lt;/p&gt;
&lt;p&gt;So.. &lt;strong&gt;Make some money&lt;/strong&gt;.&lt;/p&gt;
&lt;p&gt;Yep, that's the goal..&lt;/p&gt;
&lt;p&gt;I still strongly believe in &lt;a href=&quot;https://unolia.com/?utm_source=srwiez.com&amp;amp;utm_medium=blog&amp;amp;utm_campaign=yearly-review&quot;&gt;unolia.com&lt;/a&gt;. I have many things I would like to solve with it and It didn't get the time it deserved.&lt;/p&gt;
&lt;p&gt;You'll see me at Laracon EU.&lt;/p&gt;
&lt;p&gt;Last year I did go back from Amsterdam with the motivation to start &lt;a href=&quot;https://unolia.com/?utm_source=srwiez.com&amp;amp;utm_medium=blog&amp;amp;utm_campaign=yearly-review&quot;&gt;unolia.com&lt;/a&gt;. This year will mark the 1st anniversary of me starting the project and I would like to go out from there with the motivation to double down on it.&lt;/p&gt;
&lt;p&gt;I also strongly believe in NativePHP. I think I have submitted at least one PR every week for the last two months. I have ideas for &lt;strong&gt;apps to sell&lt;/strong&gt; and ideas for &lt;strong&gt;advanced packages to sell&lt;/strong&gt;. It has a bright future; I can guarantee you that. I would be involved in this project as much as I can.&lt;/p&gt;
&lt;p&gt;But the thing is that I have to start earning money fast.&lt;/p&gt;
&lt;p&gt;Like, really fast.&lt;/p&gt;
&lt;p&gt;I'm finally good with myself, good with my mind, and my body.&lt;/p&gt;
&lt;p&gt;So having a good financial situation is my way to an happy stable life.&lt;/p&gt;
&lt;p&gt;I &amp;quot;only&amp;quot; have to reach the 2000 € / month revenue.&lt;/p&gt;
&lt;p&gt;I'll make it, for sure.&lt;/p&gt;
&lt;p&gt;One way or another, I don't have a choice anymore.&lt;/p&gt;
&lt;p&gt;But I think I will stop open-source for a bit and make real money.&lt;/p&gt;
&lt;p&gt;Sadly there isn't enough Simon out there to make open-source worth it.&lt;/p&gt;
&lt;p&gt;I don't want to ask, but if you read this far and want to support my efforts, I would be grateful! Depending of what rewards you want:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;You can sponsor me through &lt;a href=&quot;https://github.com/sponsors/SRWieZ&quot;&gt;Github Sponsors&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;Or subscribe to &lt;a href=&quot;https://unolia.com/?utm_source=srwiez.com&amp;amp;utm_medium=blog&amp;amp;utm_campaign=yearly-review&quot;&gt;unolia.com&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;!-- - Or preorder my first NativePHP app: A Starlink companion app called [dishypilot.com](https://dishypilot.com/?utm_source=srwiez.com&amp;utm_medium=blog&amp;utm_campaign=yearly-review) (website not done yet). --&gt;
&lt;p&gt;Either way, it would be life saving right now.&lt;/p&gt;
&lt;p&gt;And please, comment below.&lt;/p&gt;
&lt;p&gt;Even just a smiley would mean a lot to me, it shows real people are reading it.&lt;/p&gt;
&lt;p&gt;I'm going to end this article by wishing you all the best.&lt;/p&gt;
&lt;p&gt;If you are that far into listening to a man struggle, you're one of the best people this planet has to offer.&lt;/p&gt;
&lt;p&gt;I hope you’re okay and that you take care of yourself.&lt;/p&gt;
&lt;p&gt;I wish all the you success and happiness.&lt;/p&gt;
&lt;p&gt;See you in 2025.&lt;/p&gt;
&lt;hr /&gt;
&lt;p&gt;&lt;strong&gt;Post scriptum.&lt;/strong&gt;&lt;br /&gt;
I read somewhere that the decisions taken in the European Commission were better because most of them weren't using their main language. The experiments showed that communicating in another language put distance between the writer and the text, eliminating emotions in the decision-making.&lt;/p&gt;
&lt;p&gt;At some point in this article, I asked myself why I don't ever express myself that much outside of my blog. I think writing in English may help me have the courage to write some of those lines.&lt;/p&gt;
&lt;p&gt;So I'm grateful for this. Hope you liked it.&lt;/p&gt;</summary>
        <content type="html">&lt;p&gt;I definitely have not followed all my wishes from &lt;a href=&quot;https://srwiez.com/posts/2023-year-in-review&quot;&gt;last year&lt;/a&gt;, but who does? This year was my 30th year on this big rock, and it marked a turn, more than I thought it would.&lt;/p&gt;
&lt;!--more--&gt;
&lt;ul class=&quot;table-of-contents not-prose&quot;&gt;
&lt;li&gt;&lt;a href=&quot;#content-traveled-a-lot&quot;&gt;Traveled a lot&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;#content-started-my-own-company&quot;&gt;Started my own company&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;#content-wrote-a-lot-more&quot;&gt;Wrote a lot more&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;#content-i-got-payed-for-open-source-work&quot;&gt;I got payed for Open Source work&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;#content-now-im-poor&quot;&gt;Now I'm poor&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;#content-but-somehow-happy&quot;&gt;But somehow happy&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;#content-whats-next-then&quot;&gt;What's next then?&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;&lt;a id=&quot;content-traveled-a-lot&quot; href=&quot;#content-traveled-a-lot&quot; class=&quot;heading-permalink&quot; aria-hidden=&quot;true&quot; tabindex=&quot;-1&quot; title=&quot;Permalink&quot;&gt;#&lt;/a&gt;Traveled a lot&lt;/h2&gt;
&lt;p&gt;If you don't know, I'm living in a van.&lt;/p&gt;
&lt;p&gt;I converted it myself and traveled through Western Europe.&lt;/p&gt;
&lt;p&gt;But not much this year because I had some paperwork to do, and it took me 9 months to get through.&lt;/p&gt;
&lt;p&gt;I still traveled a lot, though:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;January started strong: one awesome &lt;strong&gt;ski trip&lt;/strong&gt; with my friends ⛷️&lt;/li&gt;
&lt;li&gt;In February, I attended &lt;strong&gt;Laracon EU&lt;/strong&gt; in Amsterdam!&lt;/li&gt;
&lt;li&gt;In February, I also spent a week in &lt;strong&gt;Copenhagen&lt;/strong&gt; with my friends.&lt;/li&gt;
&lt;li&gt;March: another &lt;strong&gt;ski trip&lt;/strong&gt; with my cousins! ⛷️ I'm addicted!&lt;/li&gt;
&lt;li&gt;May and June: &lt;strong&gt;Festival&lt;/strong&gt; 🎶 !&lt;/li&gt;
&lt;li&gt;In July, we had the &lt;strong&gt;Olympics in Paris&lt;/strong&gt;. It was fun to watch, follow, and attend too. Really good vibes. Surprised.&lt;/li&gt;
&lt;li&gt;In August, I threw &lt;strong&gt;a big party&lt;/strong&gt; for my 30th birthday!&lt;/li&gt;
&lt;li&gt;In October, I spent two weeks in &lt;strong&gt;Turkey&lt;/strong&gt;.&lt;/li&gt;
&lt;li&gt;In November, I traveled in my van in the &lt;strong&gt;south of France&lt;/strong&gt;.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;I thought I didn't do much this year, but looking back at my photos:&lt;br /&gt;
I had a pretty good year of travels.&lt;/p&gt;
&lt;p&gt;Also, that's the trick for your yearly review:&lt;br /&gt;
Take your phone and look back at your photos.&lt;/p&gt;
&lt;h2&gt;&lt;a id=&quot;content-started-my-own-company&quot; href=&quot;#content-started-my-own-company&quot; class=&quot;heading-permalink&quot; aria-hidden=&quot;true&quot; tabindex=&quot;-1&quot; title=&quot;Permalink&quot;&gt;#&lt;/a&gt;Started my own company&lt;/h2&gt;
&lt;p&gt;I started a SaaS. Every developer's dream, right?&lt;/p&gt;
&lt;p&gt;Well, this year, I realized mine. I launched the first version of &lt;a href=&quot;https://unolia.com/?utm_source=srwiez.com&amp;amp;utm_medium=blog&amp;amp;utm_campaign=yearly-review&quot;&gt;unolia.com&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;After being at Laracon EU, I made the decision to finally start working on my big idea. I wanted a proof of concept live as fast as possible, so the first three months were very productive. I limited my product to the basics I would need: connecting every major domain provider.&lt;/p&gt;
&lt;p&gt;And in June, an open beta was online!&lt;/p&gt;
&lt;p&gt;This is not even 1/5 of the ideas I had in mind. I knew I would need to break the project down into reachable goals, so I started with domains. But the ultimate goal is to connect every service you have and write automation between them.&lt;/p&gt;
&lt;p&gt;Then... I don't know, it slowed down. I worked on it every month, but not enough.&lt;/p&gt;
&lt;p&gt;In October, I took a week to write actual marketing content.&lt;/p&gt;
&lt;p&gt;And in November, I integrated Stripe, and it's now a paid product.&lt;/p&gt;
&lt;p&gt;I made myself a promise to work at least 1 complete year on it to give it a chance.&lt;/p&gt;
&lt;p&gt;I think now that it needs 2 years because of what I see from other similar stories and also because I don't think I worked enough on it this year.&lt;/p&gt;
&lt;p&gt;Coding a SaaS is &lt;strong&gt;not hard&lt;/strong&gt;, creating a design can be fun, doing marketing is interesting, and even creating a legal structure is okay.&lt;/p&gt;
&lt;p&gt;But doing it all at the same time... boy oh boy, it's &lt;strong&gt;exhausting&lt;/strong&gt;.&lt;/p&gt;
&lt;h2&gt;&lt;a id=&quot;content-wrote-a-lot-more&quot; href=&quot;#content-wrote-a-lot-more&quot; class=&quot;heading-permalink&quot; aria-hidden=&quot;true&quot; tabindex=&quot;-1&quot; title=&quot;Permalink&quot;&gt;#&lt;/a&gt;Wrote a lot more&lt;/h2&gt;
&lt;p&gt;Last year, I published 8 articles here, well 9 with this one.&lt;/p&gt;
&lt;p&gt;I want to double that this year.&lt;/p&gt;
&lt;p&gt;I love writing. I write a lot in my bed at the end of the day or on a public bench after long hours of driving. Even writing documentation for my code and projects, I just love it.&lt;/p&gt;
&lt;p&gt;I secretly hope to write a book someday.&lt;/p&gt;
&lt;p&gt;I feel like I'm better at writing in English, and I'm also better at writing in French. I write my adventures in my notes, and sometimes I even make rhymes for the fun of it.&lt;/p&gt;
&lt;p&gt;I also tweeted more.&lt;/p&gt;
&lt;p&gt;This led me to be more visible on social networks and slowly built an audience.&lt;/p&gt;
&lt;h2&gt;&lt;a id=&quot;content-i-got-payed-for-open-source-work&quot; href=&quot;#content-i-got-payed-for-open-source-work&quot; class=&quot;heading-permalink&quot; aria-hidden=&quot;true&quot; tabindex=&quot;-1&quot; title=&quot;Permalink&quot;&gt;#&lt;/a&gt;I got payed for Open Source work&lt;/h2&gt;
&lt;p&gt;Last year, I published 4 open-source projects. This year, &lt;a href=&quot;https://srwiez.com/open-source?utm_source=srwiez.com&amp;amp;utm_medium=blog&amp;amp;utm_campaign=yearly-review&quot;&gt;8 more&lt;/a&gt;!&lt;/p&gt;
&lt;p&gt;I like sharing, writing a good API, and creating beautiful READMEs. If I have a coding problem, I'll create a solution for it. It's a good exercise, and it's gratifying because when it's done, it's done (unlike big projects).&lt;/p&gt;
&lt;p&gt;Yes, I know that after that, there is some maintenance and updates involved, but so far, I'm enjoying that too.&lt;/p&gt;
&lt;center&gt;
  &lt;a href=&quot;https://assets.srwiez.com/2024-review/git-wrapped-srwiez-2024.png&quot; title=&quot;Git Wrapped 2024&quot;&gt;
&lt;img src=&quot;https://assets.srwiez.com/2024-review/git-wrapped-srwiez-2024.png&quot; alt=&quot;Git Wrapped 2024&quot; width=&quot;65%&quot; classes=&quot;object-cover mx-auto&quot; /&gt;
    &lt;/a&gt;
&lt;/center&gt;
&lt;p&gt;I don't make any money off it. It was never the goal.&lt;/p&gt;
&lt;p&gt;BUT I still earned some money!&lt;/p&gt;
&lt;p&gt;Not on my own project, but on NativePHP. Simon reached out to me and wanted to thank me for some of my PRs on the &lt;a href=&quot;https://nativephp.com/?utm_source=srwiez.com&amp;amp;utm_medium=blog&amp;amp;utm_campaign=yearly-review&quot;&gt;nativephp.com&lt;/a&gt; website.&lt;/p&gt;
&lt;p&gt;I accepted, and shortly after, I had 250€ in my account.&lt;/p&gt;
&lt;p&gt;I was &lt;strong&gt;honored&lt;/strong&gt; and &lt;strong&gt;surprised&lt;/strong&gt;.&lt;/p&gt;
&lt;p&gt;It made me so &lt;strong&gt;happy&lt;/strong&gt;! I told all my friends, even though half of my friends didn't understand what open source is.&lt;/p&gt;
&lt;p&gt;I should have cried out loud on Twitter too. But I wasn't sure if I should. I hadn't been in this situation before. A &amp;quot;stranger&amp;quot; giving me money for something I happily did for free. Still today, I don't know why I kept it silent.&lt;/p&gt;
&lt;p&gt;Because I think it's a movement we have to support. Open-source shouldn't mean free. We're helping each other. It's only fair to help each other financially too.&lt;/p&gt;
&lt;p&gt;And everyone should know how awesome &lt;a href=&quot;https://simonhamp.me/?utm_source=srwiez.com&amp;amp;utm_medium=blog&amp;amp;utm_campaign=yearly-review&quot;&gt;Simon&lt;/a&gt; is. He's just a good guy. I believe in him, and I hope that he will succeed in every project he decides to go after next year.&lt;/p&gt;
&lt;p&gt;I wanna do more open-source, I'm good at it.&lt;/p&gt;
&lt;h2&gt;&lt;a id=&quot;content-now-im-poor&quot; href=&quot;#content-now-im-poor&quot; class=&quot;heading-permalink&quot; aria-hidden=&quot;true&quot; tabindex=&quot;-1&quot; title=&quot;Permalink&quot;&gt;#&lt;/a&gt;Now I'm poor&lt;/h2&gt;
&lt;p&gt;Talking about Money, I never been so low.&lt;/p&gt;
&lt;p&gt;All my savings are gone.&lt;/p&gt;
&lt;p&gt;It's been almost 3 years since I've been unemployed.&lt;br /&gt;
I took 2 years to travel and 1 year to discover who I am and what I want.&lt;/p&gt;
&lt;p&gt;Quite a long pause you may say but for the outcome, it was worth it.&lt;br /&gt;
(you'll see next chapter)&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;In November: I had barely enough money to drive back to my hometown.&lt;/li&gt;
&lt;li&gt;Mid December: Don't have enough to pays my insurances.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;I should be at the bottom of a pit being eaten by anxiety.&lt;/p&gt;
&lt;p&gt;In fact, I almost fell into it.&lt;/p&gt;
&lt;p&gt;But I did see it coming one evening. From my bed, I woke up again. And made a list of all my expenses and earnings. Gone through all my accounts, savings, everything.&lt;/p&gt;
&lt;p&gt;The result was.. &lt;strong&gt;concerning&lt;/strong&gt; to say the least.&lt;/p&gt;
&lt;p&gt;But at least I stopped burying my head in the sand and I had a short-term plan.&lt;/p&gt;
&lt;p&gt;So I sold some unused hardware.&lt;br /&gt;
And later, all my remaining cryptocurrencies.&lt;br /&gt;
I won a little amount of money here and there.&lt;/p&gt;
&lt;p&gt;By my estimations, I can live until mid-February. Then... well, I don't know.&lt;/p&gt;
&lt;p&gt;I started searching for short missions and peeked at some real jobs, but I don't want to go back to any company. I can't handle having a boss anymore. I want partners. I only want to work with people I could eat lunch with every day (in the sense that I like them).&lt;/p&gt;
&lt;p&gt;Having no money has been &amp;quot;good.&amp;quot;&lt;/p&gt;
&lt;p&gt;Living in a van taught me how valuable water, hot water, electricity, and comfort are.&lt;/p&gt;
&lt;p&gt;Being poor taught me how to live with a minimum amount. With my current way of life, I could work on open source all day, every day, for just about ~2000 € per month (before taxes 😅).&lt;/p&gt;
&lt;p&gt;Of course, I want more. Just look back at every trip I've taken last year.&lt;/p&gt;
&lt;p&gt;But at least I know how to live with less now.&lt;/p&gt;
&lt;p&gt;This is now my new minimum I have to achieve.&lt;/p&gt;
&lt;h2&gt;&lt;a id=&quot;content-but-somehow-happy&quot; href=&quot;#content-but-somehow-happy&quot; class=&quot;heading-permalink&quot; aria-hidden=&quot;true&quot; tabindex=&quot;-1&quot; title=&quot;Permalink&quot;&gt;#&lt;/a&gt;But somehow happy&lt;/h2&gt;
&lt;p&gt;The thing is, I think I finally found how I want to live this life.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Far less alcohol (and drugs)&lt;/strong&gt;&lt;br /&gt;
I used to say that alcohol has no effect on me. And yes, I can drink a considerable amount before losing control. But I also discovered that it was one of the culprits for my degraded health. I don't want to be drunk anymore, even for a good party or a big festival. Life is short; I don't want to waste any days by being hungover. I feel like I'm too old for this. It was fun, but now my body is taking too long to recover.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Live outside&lt;/strong&gt;&lt;br /&gt;
Ok, obviously I don't want to live in a van for the rest of my life. But I like being in contact with nature. If I can, I would continue to travel, go backpacking, and cycle. But the ultimate goal is to have enough money to buy land, have a tiny house, and a garden. Programming with a view.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Focus on myself&lt;/strong&gt;&lt;br /&gt;
I'm done doing things for the love of others. I don't want to be defined by others. I don't want to please anyone. It seems extreme said like this, but I hurt myself a lot just to find someone to love me back. I have made peace with myself. I'm okay being alone most of the time.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Doing what I love&lt;/strong&gt;&lt;br /&gt;
I love tinkering. That's what makes me happy. Domotizing a house, upgrading a car, converting a van, and making web, CLI, and desktop apps are some of the things I have made in the last 3 years, and I absolutely loved doing them. When I was younger, I said that I wanted to be an inventor. And look mom, I did become one!&lt;/p&gt;
&lt;h2&gt;&lt;a id=&quot;content-whats-next-then&quot; href=&quot;#content-whats-next-then&quot; class=&quot;heading-permalink&quot; aria-hidden=&quot;true&quot; tabindex=&quot;-1&quot; title=&quot;Permalink&quot;&gt;#&lt;/a&gt;What's next then?&lt;/h2&gt;
&lt;p&gt;Last year I had money but I wasn't really happy.&lt;br /&gt;
This year I'm happy but I don't have any money.&lt;/p&gt;
&lt;p&gt;Funny how the life works, huh.&lt;/p&gt;
&lt;p&gt;So.. &lt;strong&gt;Make some money&lt;/strong&gt;.&lt;/p&gt;
&lt;p&gt;Yep, that's the goal..&lt;/p&gt;
&lt;p&gt;I still strongly believe in &lt;a href=&quot;https://unolia.com/?utm_source=srwiez.com&amp;amp;utm_medium=blog&amp;amp;utm_campaign=yearly-review&quot;&gt;unolia.com&lt;/a&gt;. I have many things I would like to solve with it and It didn't get the time it deserved.&lt;/p&gt;
&lt;p&gt;You'll see me at Laracon EU.&lt;/p&gt;
&lt;p&gt;Last year I did go back from Amsterdam with the motivation to start &lt;a href=&quot;https://unolia.com/?utm_source=srwiez.com&amp;amp;utm_medium=blog&amp;amp;utm_campaign=yearly-review&quot;&gt;unolia.com&lt;/a&gt;. This year will mark the 1st anniversary of me starting the project and I would like to go out from there with the motivation to double down on it.&lt;/p&gt;
&lt;p&gt;I also strongly believe in NativePHP. I think I have submitted at least one PR every week for the last two months. I have ideas for &lt;strong&gt;apps to sell&lt;/strong&gt; and ideas for &lt;strong&gt;advanced packages to sell&lt;/strong&gt;. It has a bright future; I can guarantee you that. I would be involved in this project as much as I can.&lt;/p&gt;
&lt;p&gt;But the thing is that I have to start earning money fast.&lt;/p&gt;
&lt;p&gt;Like, really fast.&lt;/p&gt;
&lt;p&gt;I'm finally good with myself, good with my mind, and my body.&lt;/p&gt;
&lt;p&gt;So having a good financial situation is my way to an happy stable life.&lt;/p&gt;
&lt;p&gt;I &amp;quot;only&amp;quot; have to reach the 2000 € / month revenue.&lt;/p&gt;
&lt;p&gt;I'll make it, for sure.&lt;/p&gt;
&lt;p&gt;One way or another, I don't have a choice anymore.&lt;/p&gt;
&lt;p&gt;But I think I will stop open-source for a bit and make real money.&lt;/p&gt;
&lt;p&gt;Sadly there isn't enough Simon out there to make open-source worth it.&lt;/p&gt;
&lt;p&gt;I don't want to ask, but if you read this far and want to support my efforts, I would be grateful! Depending of what rewards you want:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;You can sponsor me through &lt;a href=&quot;https://github.com/sponsors/SRWieZ&quot;&gt;Github Sponsors&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;Or subscribe to &lt;a href=&quot;https://unolia.com/?utm_source=srwiez.com&amp;amp;utm_medium=blog&amp;amp;utm_campaign=yearly-review&quot;&gt;unolia.com&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;!-- - Or preorder my first NativePHP app: A Starlink companion app called [dishypilot.com](https://dishypilot.com/?utm_source=srwiez.com&amp;utm_medium=blog&amp;utm_campaign=yearly-review) (website not done yet). --&gt;
&lt;p&gt;Either way, it would be life saving right now.&lt;/p&gt;
&lt;p&gt;And please, comment below.&lt;/p&gt;
&lt;p&gt;Even just a smiley would mean a lot to me, it shows real people are reading it.&lt;/p&gt;
&lt;p&gt;I'm going to end this article by wishing you all the best.&lt;/p&gt;
&lt;p&gt;If you are that far into listening to a man struggle, you're one of the best people this planet has to offer.&lt;/p&gt;
&lt;p&gt;I hope you’re okay and that you take care of yourself.&lt;/p&gt;
&lt;p&gt;I wish all the you success and happiness.&lt;/p&gt;
&lt;p&gt;See you in 2025.&lt;/p&gt;
&lt;hr /&gt;
&lt;p&gt;&lt;strong&gt;Post scriptum.&lt;/strong&gt;&lt;br /&gt;
I read somewhere that the decisions taken in the European Commission were better because most of them weren't using their main language. The experiments showed that communicating in another language put distance between the writer and the text, eliminating emotions in the decision-making.&lt;/p&gt;
&lt;p&gt;At some point in this article, I asked myself why I don't ever express myself that much outside of my blog. I think writing in English may help me have the courage to write some of those lines.&lt;/p&gt;
&lt;p&gt;So I'm grateful for this. Hope you liked it.&lt;/p&gt;</content>
        <author>
            <name>Eser DENIZ</name>
        </author>
    </entry>
    <entry>
        <title type="text">My take on Bluesky</title>
        <link href="https://srwiez.com/posts/my-take-on-bluesky"/>
        <id>https://srwiez.com/posts/my-take-on-bluesky</id>
        <published>2024-12-04T00:00:00+00:00</published>
        <updated>2024-12-04T09:18:54+00:00</updated>
        <summary type="text">&lt;p&gt;Well, here we go again. This is supposed to be a technical blog, but I enjoy giving my opinion more and more. This is a direct reply/reaction to the discussion Ian and Aaron had on &lt;a href=&quot;https://mostlytechnical.com/episodes/61-chasing-vanity&quot;&gt;Mostly Technical&lt;/a&gt;. An alternative title is &amp;quot;Twitter vs. Bluesky.&amp;quot; You've been warned.&lt;/p&gt;
&lt;!--more--&gt;
&lt;ul class=&quot;table-of-contents not-prose&quot;&gt;
&lt;li&gt;&lt;a href=&quot;#content-mainstream&quot;&gt;Mainstream&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;#content-discover-vs-following-feed&quot;&gt;Discover VS Following feed&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;#content-sharing-a-link&quot;&gt;Sharing a link&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;#content--tldr&quot;&gt;→ TLDR&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;&lt;a id=&quot;content-mainstream&quot; href=&quot;#content-mainstream&quot; class=&quot;heading-permalink&quot; aria-hidden=&quot;true&quot; tabindex=&quot;-1&quot; title=&quot;Permalink&quot;&gt;#&lt;/a&gt;Mainstream&lt;/h2&gt;
&lt;p&gt;What I consider mainstream is that my IRL friends are on it.&lt;/p&gt;
&lt;p&gt;Bluesky is not mainstream yet.&lt;/p&gt;
&lt;p&gt;And I hope it will never be.&lt;/p&gt;
&lt;p&gt;When I registered on Twitter in 2009 (that long 😲), there were only tech people on it. A few years later, I remember my IRL friends saying, &amp;quot;Did you see this new thing called Twitter?&amp;quot; and my reply was always, &amp;quot;Yeah man, I've been on it from the beginning, years ago, and it's great. &amp;quot;&lt;/p&gt;
&lt;p&gt;Some years later, everyone is telling me that the content is shit and they don't go anymore. But I'm still happy there because of one thing: I handpicked every people I follow.&lt;/p&gt;
&lt;p&gt;I hear Aaron complaining about politics and sports stuff on Twitter/Bluesky, and Ian about some gory things that pop up. I never had those. I mean here and there, but not as much as you seem to have in the American feed algorithm.&lt;/p&gt;
&lt;p&gt;Maybe the problem comes from who you are following. I remember following a friend who tweeted about the NBA and football (⚽️ the real one with a ball at your foot) all day long, and it was poisoning my beautiful tech Twitter. I unfollowed him immediately and added football as a muted word ^^&lt;/p&gt;
&lt;p&gt;Muted words are awesome.&lt;/p&gt;
&lt;p&gt;Mainstream people are noisy.&lt;/p&gt;
&lt;h2&gt;&lt;a id=&quot;content-discover-vs-following-feed&quot; href=&quot;#content-discover-vs-following-feed&quot; class=&quot;heading-permalink&quot; aria-hidden=&quot;true&quot; tabindex=&quot;-1&quot; title=&quot;Permalink&quot;&gt;#&lt;/a&gt;Discover VS Following feed&lt;/h2&gt;
&lt;p&gt;I always preferred the Following feed.&lt;/p&gt;
&lt;p&gt;I want my feed to be chronological so I can see the content from accounts I chose to follow. The same goes for YouTube btw.&lt;/p&gt;
&lt;p&gt;I discover new people through retweets. Much like real life, you meet someone new through a common party or recommendation. It the retweeted tweet is cool: you go to their profile, and if their content seems to be of interest to you, you click on that &amp;quot;Follow&amp;quot; button. Easy.&lt;/p&gt;
&lt;p&gt;And you know what the cool part is? You can &amp;quot;Unfollow&amp;quot; when it's no longer in your interest.&lt;/p&gt;
&lt;p&gt;I do click on the &amp;quot;Discover&amp;quot; and &amp;quot;For You&amp;quot; tabs from time to time when I finish reading my Following tab, but only when I'm bored.&lt;/p&gt;
&lt;p&gt;We're not meant to read every f*cking thing that happens in the internet.&lt;/p&gt;
&lt;p&gt;Just focus on what you enjoy reading and learning.&lt;/p&gt;
&lt;h2&gt;&lt;a id=&quot;content-sharing-a-link&quot; href=&quot;#content-sharing-a-link&quot; class=&quot;heading-permalink&quot; aria-hidden=&quot;true&quot; tabindex=&quot;-1&quot; title=&quot;Permalink&quot;&gt;#&lt;/a&gt;Sharing a link&lt;/h2&gt;
&lt;p&gt;I mentioned how great the early Twitter era was, but there’s something I didn’t tell you: it replaced my RSS feed. Every major blog had a bot account that posted new articles, and I loved scrolling to the top to read my news.&lt;/p&gt;
&lt;p&gt;However, someone at Twitter decided that this was no longer a good thing..&lt;/p&gt;
&lt;p&gt;I think that lowering the visibility of tweets with links was a terrible mistake. I know why they did that, still a mistake. I hated every moment I had to click on a tweet to see the link attached to it.&lt;/p&gt;
&lt;p&gt;Also, I believe that displaying views and monetising them significantly contributed to making Twitter a worse place. Tweeting should not be a job or a daily goal.&lt;/p&gt;
&lt;p&gt;Seeing liked posts on my feed made it worse too. If the person wanted me to know, he would have clicked on the retweet button.&lt;/p&gt;
&lt;p&gt;I don't know what could make Twitter great again.&lt;/p&gt;
&lt;p&gt;And it's too early to say if Bluesky is that shiny.&lt;/p&gt;
&lt;h2&gt;&lt;a id=&quot;content--tldr&quot; href=&quot;#content--tldr&quot; class=&quot;heading-permalink&quot; aria-hidden=&quot;true&quot; tabindex=&quot;-1&quot; title=&quot;Permalink&quot;&gt;#&lt;/a&gt;→ TLDR&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;In 2009, Twitter replaced IRC and RSS for me.&lt;/li&gt;
&lt;li&gt;Bluesky is great because of the lack of algorithms.&lt;/li&gt;
&lt;li&gt;Stay in the Following tab, read it as your newspaper, and stop doom scrolling.&lt;/li&gt;
&lt;li&gt;Muted words are important on every social network.&lt;/li&gt;
&lt;li&gt;You can control what you see on social networks.&lt;/li&gt;
&lt;li&gt;Stats are what make people chase vanity.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Still don't know who you are and why you read such articles. Hope you enjoyed!&lt;/p&gt;
&lt;p&gt;Bonus, thanks to &lt;a href=&quot;https://statamic.com/addons/mity-digital/bluesky-comments&quot;&gt;Bluesky comment Statamic addon&lt;/a&gt;, you can comment on my blog now.&lt;/p&gt;</summary>
        <content type="html">&lt;p&gt;Well, here we go again. This is supposed to be a technical blog, but I enjoy giving my opinion more and more. This is a direct reply/reaction to the discussion Ian and Aaron had on &lt;a href=&quot;https://mostlytechnical.com/episodes/61-chasing-vanity&quot;&gt;Mostly Technical&lt;/a&gt;. An alternative title is &amp;quot;Twitter vs. Bluesky.&amp;quot; You've been warned.&lt;/p&gt;
&lt;!--more--&gt;
&lt;ul class=&quot;table-of-contents not-prose&quot;&gt;
&lt;li&gt;&lt;a href=&quot;#content-mainstream&quot;&gt;Mainstream&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;#content-discover-vs-following-feed&quot;&gt;Discover VS Following feed&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;#content-sharing-a-link&quot;&gt;Sharing a link&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;#content--tldr&quot;&gt;→ TLDR&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;&lt;a id=&quot;content-mainstream&quot; href=&quot;#content-mainstream&quot; class=&quot;heading-permalink&quot; aria-hidden=&quot;true&quot; tabindex=&quot;-1&quot; title=&quot;Permalink&quot;&gt;#&lt;/a&gt;Mainstream&lt;/h2&gt;
&lt;p&gt;What I consider mainstream is that my IRL friends are on it.&lt;/p&gt;
&lt;p&gt;Bluesky is not mainstream yet.&lt;/p&gt;
&lt;p&gt;And I hope it will never be.&lt;/p&gt;
&lt;p&gt;When I registered on Twitter in 2009 (that long 😲), there were only tech people on it. A few years later, I remember my IRL friends saying, &amp;quot;Did you see this new thing called Twitter?&amp;quot; and my reply was always, &amp;quot;Yeah man, I've been on it from the beginning, years ago, and it's great. &amp;quot;&lt;/p&gt;
&lt;p&gt;Some years later, everyone is telling me that the content is shit and they don't go anymore. But I'm still happy there because of one thing: I handpicked every people I follow.&lt;/p&gt;
&lt;p&gt;I hear Aaron complaining about politics and sports stuff on Twitter/Bluesky, and Ian about some gory things that pop up. I never had those. I mean here and there, but not as much as you seem to have in the American feed algorithm.&lt;/p&gt;
&lt;p&gt;Maybe the problem comes from who you are following. I remember following a friend who tweeted about the NBA and football (⚽️ the real one with a ball at your foot) all day long, and it was poisoning my beautiful tech Twitter. I unfollowed him immediately and added football as a muted word ^^&lt;/p&gt;
&lt;p&gt;Muted words are awesome.&lt;/p&gt;
&lt;p&gt;Mainstream people are noisy.&lt;/p&gt;
&lt;h2&gt;&lt;a id=&quot;content-discover-vs-following-feed&quot; href=&quot;#content-discover-vs-following-feed&quot; class=&quot;heading-permalink&quot; aria-hidden=&quot;true&quot; tabindex=&quot;-1&quot; title=&quot;Permalink&quot;&gt;#&lt;/a&gt;Discover VS Following feed&lt;/h2&gt;
&lt;p&gt;I always preferred the Following feed.&lt;/p&gt;
&lt;p&gt;I want my feed to be chronological so I can see the content from accounts I chose to follow. The same goes for YouTube btw.&lt;/p&gt;
&lt;p&gt;I discover new people through retweets. Much like real life, you meet someone new through a common party or recommendation. It the retweeted tweet is cool: you go to their profile, and if their content seems to be of interest to you, you click on that &amp;quot;Follow&amp;quot; button. Easy.&lt;/p&gt;
&lt;p&gt;And you know what the cool part is? You can &amp;quot;Unfollow&amp;quot; when it's no longer in your interest.&lt;/p&gt;
&lt;p&gt;I do click on the &amp;quot;Discover&amp;quot; and &amp;quot;For You&amp;quot; tabs from time to time when I finish reading my Following tab, but only when I'm bored.&lt;/p&gt;
&lt;p&gt;We're not meant to read every f*cking thing that happens in the internet.&lt;/p&gt;
&lt;p&gt;Just focus on what you enjoy reading and learning.&lt;/p&gt;
&lt;h2&gt;&lt;a id=&quot;content-sharing-a-link&quot; href=&quot;#content-sharing-a-link&quot; class=&quot;heading-permalink&quot; aria-hidden=&quot;true&quot; tabindex=&quot;-1&quot; title=&quot;Permalink&quot;&gt;#&lt;/a&gt;Sharing a link&lt;/h2&gt;
&lt;p&gt;I mentioned how great the early Twitter era was, but there’s something I didn’t tell you: it replaced my RSS feed. Every major blog had a bot account that posted new articles, and I loved scrolling to the top to read my news.&lt;/p&gt;
&lt;p&gt;However, someone at Twitter decided that this was no longer a good thing..&lt;/p&gt;
&lt;p&gt;I think that lowering the visibility of tweets with links was a terrible mistake. I know why they did that, still a mistake. I hated every moment I had to click on a tweet to see the link attached to it.&lt;/p&gt;
&lt;p&gt;Also, I believe that displaying views and monetising them significantly contributed to making Twitter a worse place. Tweeting should not be a job or a daily goal.&lt;/p&gt;
&lt;p&gt;Seeing liked posts on my feed made it worse too. If the person wanted me to know, he would have clicked on the retweet button.&lt;/p&gt;
&lt;p&gt;I don't know what could make Twitter great again.&lt;/p&gt;
&lt;p&gt;And it's too early to say if Bluesky is that shiny.&lt;/p&gt;
&lt;h2&gt;&lt;a id=&quot;content--tldr&quot; href=&quot;#content--tldr&quot; class=&quot;heading-permalink&quot; aria-hidden=&quot;true&quot; tabindex=&quot;-1&quot; title=&quot;Permalink&quot;&gt;#&lt;/a&gt;→ TLDR&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;In 2009, Twitter replaced IRC and RSS for me.&lt;/li&gt;
&lt;li&gt;Bluesky is great because of the lack of algorithms.&lt;/li&gt;
&lt;li&gt;Stay in the Following tab, read it as your newspaper, and stop doom scrolling.&lt;/li&gt;
&lt;li&gt;Muted words are important on every social network.&lt;/li&gt;
&lt;li&gt;You can control what you see on social networks.&lt;/li&gt;
&lt;li&gt;Stats are what make people chase vanity.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Still don't know who you are and why you read such articles. Hope you enjoyed!&lt;/p&gt;
&lt;p&gt;Bonus, thanks to &lt;a href=&quot;https://statamic.com/addons/mity-digital/bluesky-comments&quot;&gt;Bluesky comment Statamic addon&lt;/a&gt;, you can comment on my blog now.&lt;/p&gt;</content>
        <author>
            <name>Eser DENIZ</name>
        </author>
    </entry>
    <entry>
        <title type="text">My take on Statamic's future</title>
        <link href="https://srwiez.com/posts/my-take-on-statamic-future"/>
        <id>https://srwiez.com/posts/my-take-on-statamic-future</id>
        <published>2024-10-18T00:00:00+00:00</published>
        <updated>2024-10-18T11:13:52+00:00</updated>
        <summary type="text">&lt;p&gt;Recently, &lt;a href=&quot;https://jackmcdade.com&quot;&gt;Jack McDade&lt;/a&gt; (creator of Statamic) started a discussion on the &lt;a href=&quot;https://mostlytechnical.com/episodes/52-statamic-roundtable-with-jack-mcdade-john-onolan-caleb-porzio-adam-wathan&quot;&gt;future of Statamic&lt;/a&gt;. I have been using Statamic for a while now and I have some thoughts on the future of Statamic.&lt;!--more--&gt;&lt;/p&gt;
&lt;p&gt;You are currently on a Statamic website. Statamic is great, especially if you are a developer, even more if you are a Laravel developer.&lt;/p&gt;
&lt;ul class=&quot;table-of-contents not-prose&quot;&gt;
&lt;li&gt;&lt;a href=&quot;#content-flat-file-is-awesome&quot;&gt;Flat file is awesome&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;#content-antlers-is-cool-but&quot;&gt;Antlers is cool, but...&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;#content-pricing-and-market-needs&quot;&gt;Pricing and market needs&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;#content-statamic-should-definitively-have-cloud-hosting&quot;&gt;Statamic should definitively have cloud hosting&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;#content-tldr&quot;&gt;TL;DR&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;&lt;a id=&quot;content-flat-file-is-awesome&quot; href=&quot;#content-flat-file-is-awesome&quot; class=&quot;heading-permalink&quot; aria-hidden=&quot;true&quot; tabindex=&quot;-1&quot; title=&quot;Permalink&quot;&gt;#&lt;/a&gt;Flat file is awesome&lt;/h2&gt;
&lt;p&gt;I like writing my articles in Markdown. I use the control panel to create and manage my content, but I write the content of my articles in PHPStorm. I'm a developer, so writing my articles from my IDE feels like home. I have my shortcuts, my plugins, my themes, my settings, my everything. I even use GitHub Copilot when I don't remember a word.&lt;/p&gt;
&lt;p&gt;That said, for the future, and to make it more accessible to non-developers, I think Statamic should run on SQLite by default.&lt;/p&gt;
&lt;h2&gt;&lt;a id=&quot;content-antlers-is-cool-but&quot; href=&quot;#content-antlers-is-cool-but&quot; class=&quot;heading-permalink&quot; aria-hidden=&quot;true&quot; tabindex=&quot;-1&quot; title=&quot;Permalink&quot;&gt;#&lt;/a&gt;Antlers is cool, but...&lt;/h2&gt;
&lt;p&gt;It had never been properly supported in my IDE, and it becomes unreadable and broken every time I try to auto-format it. Autocomplete will also help me learn the syntax. When I use a package or framework, there are a lot of functions I never read the docs for; it's just in my IDE, and I understand what it does by reading the function signature.&lt;/p&gt;
&lt;p&gt;I have never tried to make a Statamic website with Blade, but I understand there are some limitations, and the documentation recommends sticking with Antlers, so that's what I do.&lt;/p&gt;
&lt;p&gt;I'm in between; I think it's cool, but I'm kind of frustrated by it.&lt;/p&gt;
&lt;h2&gt;&lt;a id=&quot;content-pricing-and-market-needs&quot; href=&quot;#content-pricing-and-market-needs&quot; class=&quot;heading-permalink&quot; aria-hidden=&quot;true&quot; tabindex=&quot;-1&quot; title=&quot;Permalink&quot;&gt;#&lt;/a&gt;Pricing and market needs&lt;/h2&gt;
&lt;p&gt;I remember the first time I heard about Statamic. I did go to the website and I saw the price and said, &amp;quot;No way it can't be that worth&amp;quot;. I judged it without even trying it.&lt;/p&gt;
&lt;p&gt;And today, I think the price is totally fair!&lt;/p&gt;
&lt;p&gt;I don't pay for Statamic (sorry, Jack 😬). I don't need the pro features except for Git automation, and I use a basic bash script with a cron job for that. I may have purchased a license if there had been a no-brainer $99 license that included Git automation and multiple users. Soon enough, I will purchase a license for an upcoming multilingual website I'm working on.&lt;/p&gt;
&lt;p&gt;From what I see of the WordPress market in France, it's split like this:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Non-tech people&lt;/strong&gt; using WordPress to create their websites because family and friends told them to use WordPress. They use a hosting service that provides a one-click install of WordPress.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Independent designers&lt;/strong&gt; who create websites for small businesses. They use web hosting services that provide a one-click install of WordPress and customize it through themes, plugins, and FTP.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Web agencies&lt;/strong&gt; that create websites for medium to large businesses. They have their own servers and customize WordPress beyond its original capabilities by connecting it to other services, creating custom themes, and plugins.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;So my point of view is:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Free should be pushed more to the front page&lt;/li&gt;
&lt;li&gt;$99 for Git automation and multiple users&lt;/li&gt;
&lt;li&gt;Hosting service with monthly subscription&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;&lt;a id=&quot;content-statamic-should-definitively-have-cloud-hosting&quot; href=&quot;#content-statamic-should-definitively-have-cloud-hosting&quot; class=&quot;heading-permalink&quot; aria-hidden=&quot;true&quot; tabindex=&quot;-1&quot; title=&quot;Permalink&quot;&gt;#&lt;/a&gt;Statamic should definitively have cloud hosting&lt;/h2&gt;
&lt;p&gt;This is a no-brainer, there is a market for it. It's even been in my Trello of ideas to create a Statamic hosting service. Even a simple one to start that basically only does what Forge does for Laravel: a one-click install.&lt;/p&gt;
&lt;p&gt;But I also think it should go a little further:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;It should have its own starter kit to start a blog, a portfolio, a company website, etc.&lt;/li&gt;
&lt;li&gt;It should be easy to install addons from the control panel (curated by Statamic)&lt;/li&gt;
&lt;li&gt;Themes should be editable from the control panel for non-developers&lt;/li&gt;
&lt;li&gt;It should support static caching and be enabled by default&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;&lt;a id=&quot;content-tldr&quot; href=&quot;#content-tldr&quot; class=&quot;heading-permalink&quot; aria-hidden=&quot;true&quot; tabindex=&quot;-1&quot; title=&quot;Permalink&quot;&gt;#&lt;/a&gt;TL;DR&lt;/h2&gt;
&lt;p&gt;I think Statamic should:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Run on SQLite by default&lt;/li&gt;
&lt;li&gt;Improve Antlers support in IDE&lt;/li&gt;
&lt;li&gt;$99 for Git automation and multiple users&lt;/li&gt;
&lt;li&gt;Hosting service with monthly subscription&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;If Jack reads this or anyone else really: I will be happy to discuss or develop any of these points with you in person Laravel EU or on any of my social networks.&lt;/p&gt;</summary>
        <content type="html">&lt;p&gt;Recently, &lt;a href=&quot;https://jackmcdade.com&quot;&gt;Jack McDade&lt;/a&gt; (creator of Statamic) started a discussion on the &lt;a href=&quot;https://mostlytechnical.com/episodes/52-statamic-roundtable-with-jack-mcdade-john-onolan-caleb-porzio-adam-wathan&quot;&gt;future of Statamic&lt;/a&gt;. I have been using Statamic for a while now and I have some thoughts on the future of Statamic.&lt;!--more--&gt;&lt;/p&gt;
&lt;p&gt;You are currently on a Statamic website. Statamic is great, especially if you are a developer, even more if you are a Laravel developer.&lt;/p&gt;
&lt;ul class=&quot;table-of-contents not-prose&quot;&gt;
&lt;li&gt;&lt;a href=&quot;#content-flat-file-is-awesome&quot;&gt;Flat file is awesome&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;#content-antlers-is-cool-but&quot;&gt;Antlers is cool, but...&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;#content-pricing-and-market-needs&quot;&gt;Pricing and market needs&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;#content-statamic-should-definitively-have-cloud-hosting&quot;&gt;Statamic should definitively have cloud hosting&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;#content-tldr&quot;&gt;TL;DR&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;&lt;a id=&quot;content-flat-file-is-awesome&quot; href=&quot;#content-flat-file-is-awesome&quot; class=&quot;heading-permalink&quot; aria-hidden=&quot;true&quot; tabindex=&quot;-1&quot; title=&quot;Permalink&quot;&gt;#&lt;/a&gt;Flat file is awesome&lt;/h2&gt;
&lt;p&gt;I like writing my articles in Markdown. I use the control panel to create and manage my content, but I write the content of my articles in PHPStorm. I'm a developer, so writing my articles from my IDE feels like home. I have my shortcuts, my plugins, my themes, my settings, my everything. I even use GitHub Copilot when I don't remember a word.&lt;/p&gt;
&lt;p&gt;That said, for the future, and to make it more accessible to non-developers, I think Statamic should run on SQLite by default.&lt;/p&gt;
&lt;h2&gt;&lt;a id=&quot;content-antlers-is-cool-but&quot; href=&quot;#content-antlers-is-cool-but&quot; class=&quot;heading-permalink&quot; aria-hidden=&quot;true&quot; tabindex=&quot;-1&quot; title=&quot;Permalink&quot;&gt;#&lt;/a&gt;Antlers is cool, but...&lt;/h2&gt;
&lt;p&gt;It had never been properly supported in my IDE, and it becomes unreadable and broken every time I try to auto-format it. Autocomplete will also help me learn the syntax. When I use a package or framework, there are a lot of functions I never read the docs for; it's just in my IDE, and I understand what it does by reading the function signature.&lt;/p&gt;
&lt;p&gt;I have never tried to make a Statamic website with Blade, but I understand there are some limitations, and the documentation recommends sticking with Antlers, so that's what I do.&lt;/p&gt;
&lt;p&gt;I'm in between; I think it's cool, but I'm kind of frustrated by it.&lt;/p&gt;
&lt;h2&gt;&lt;a id=&quot;content-pricing-and-market-needs&quot; href=&quot;#content-pricing-and-market-needs&quot; class=&quot;heading-permalink&quot; aria-hidden=&quot;true&quot; tabindex=&quot;-1&quot; title=&quot;Permalink&quot;&gt;#&lt;/a&gt;Pricing and market needs&lt;/h2&gt;
&lt;p&gt;I remember the first time I heard about Statamic. I did go to the website and I saw the price and said, &amp;quot;No way it can't be that worth&amp;quot;. I judged it without even trying it.&lt;/p&gt;
&lt;p&gt;And today, I think the price is totally fair!&lt;/p&gt;
&lt;p&gt;I don't pay for Statamic (sorry, Jack 😬). I don't need the pro features except for Git automation, and I use a basic bash script with a cron job for that. I may have purchased a license if there had been a no-brainer $99 license that included Git automation and multiple users. Soon enough, I will purchase a license for an upcoming multilingual website I'm working on.&lt;/p&gt;
&lt;p&gt;From what I see of the WordPress market in France, it's split like this:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Non-tech people&lt;/strong&gt; using WordPress to create their websites because family and friends told them to use WordPress. They use a hosting service that provides a one-click install of WordPress.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Independent designers&lt;/strong&gt; who create websites for small businesses. They use web hosting services that provide a one-click install of WordPress and customize it through themes, plugins, and FTP.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Web agencies&lt;/strong&gt; that create websites for medium to large businesses. They have their own servers and customize WordPress beyond its original capabilities by connecting it to other services, creating custom themes, and plugins.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;So my point of view is:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Free should be pushed more to the front page&lt;/li&gt;
&lt;li&gt;$99 for Git automation and multiple users&lt;/li&gt;
&lt;li&gt;Hosting service with monthly subscription&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;&lt;a id=&quot;content-statamic-should-definitively-have-cloud-hosting&quot; href=&quot;#content-statamic-should-definitively-have-cloud-hosting&quot; class=&quot;heading-permalink&quot; aria-hidden=&quot;true&quot; tabindex=&quot;-1&quot; title=&quot;Permalink&quot;&gt;#&lt;/a&gt;Statamic should definitively have cloud hosting&lt;/h2&gt;
&lt;p&gt;This is a no-brainer, there is a market for it. It's even been in my Trello of ideas to create a Statamic hosting service. Even a simple one to start that basically only does what Forge does for Laravel: a one-click install.&lt;/p&gt;
&lt;p&gt;But I also think it should go a little further:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;It should have its own starter kit to start a blog, a portfolio, a company website, etc.&lt;/li&gt;
&lt;li&gt;It should be easy to install addons from the control panel (curated by Statamic)&lt;/li&gt;
&lt;li&gt;Themes should be editable from the control panel for non-developers&lt;/li&gt;
&lt;li&gt;It should support static caching and be enabled by default&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;&lt;a id=&quot;content-tldr&quot; href=&quot;#content-tldr&quot; class=&quot;heading-permalink&quot; aria-hidden=&quot;true&quot; tabindex=&quot;-1&quot; title=&quot;Permalink&quot;&gt;#&lt;/a&gt;TL;DR&lt;/h2&gt;
&lt;p&gt;I think Statamic should:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Run on SQLite by default&lt;/li&gt;
&lt;li&gt;Improve Antlers support in IDE&lt;/li&gt;
&lt;li&gt;$99 for Git automation and multiple users&lt;/li&gt;
&lt;li&gt;Hosting service with monthly subscription&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;If Jack reads this or anyone else really: I will be happy to discuss or develop any of these points with you in person Laravel EU or on any of my social networks.&lt;/p&gt;</content>
        <author>
            <name>Eser DENIZ</name>
        </author>
    </entry>
    <entry>
        <title type="text">Upgrade your Filament notifications by live updating them</title>
        <link href="https://srwiez.com/posts/upgrade-your-filament-notifications-by-live-updating-them"/>
        <id>https://srwiez.com/posts/upgrade-your-filament-notifications-by-live-updating-them</id>
        <published>2024-09-10T00:00:00+00:00</published>
        <updated>2024-09-10T22:02:00+00:00</updated>
        <summary type="text">&lt;p&gt;While working on &lt;a href=&quot;https://unolia.com&quot;&gt;unolia.com&lt;/a&gt; I made a little upgrade to my notifications! I wanted my user to have feedback on the progress of the tasks. In one PHP class, no additional table, clean API.&lt;!-- more --&gt;&lt;/p&gt;
&lt;ul class=&quot;table-of-contents not-prose&quot;&gt;
&lt;li&gt;&lt;a href=&quot;#content-prerequisites&quot;&gt;Prerequisites&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;#content-the-problem&quot;&gt;The problem&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;#content-the-solution&quot;&gt;The solution&lt;/a&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;#content-customize-filament&quot;&gt;Customize Filament&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;#content-create-a-new-helper-class-&quot;&gt;Create a new helper class 🎨&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;#content-use-it-on-your-project&quot;&gt;Use it on your project&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;#content-security-concern&quot;&gt;Security concern&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;#content-how-can-we-do-more&quot;&gt;How can we do more?&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;&lt;a id=&quot;content-prerequisites&quot; href=&quot;#content-prerequisites&quot; class=&quot;heading-permalink&quot; aria-hidden=&quot;true&quot; tabindex=&quot;-1&quot; title=&quot;Permalink&quot;&gt;#&lt;/a&gt;Prerequisites&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;Laravel 11 app (with at least job batches and anonymous events)&lt;/li&gt;
&lt;li&gt;Laravel Reverb installed and configured&lt;/li&gt;
&lt;li&gt;Filament v3 Notifications&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;&lt;a id=&quot;content-the-problem&quot; href=&quot;#content-the-problem&quot; class=&quot;heading-permalink&quot; aria-hidden=&quot;true&quot; tabindex=&quot;-1&quot; title=&quot;Permalink&quot;&gt;#&lt;/a&gt;The problem&lt;/h2&gt;
&lt;p&gt;To better understand what we are trying to improve, here is the current Livewire function that is called when the user requests issues to be checked.&lt;/p&gt;
&lt;div x-data=&quot;codeBlock&quot; class=&quot;code-block relative&quot;&gt;&lt;div class=&quot;flex space-x-2 items-center absolute top-0 right-0&quot;&gt;
    &lt;div x-cloak x-show=&quot;showMessage&quot; x-transition class=&quot;py-2 animate-bounce transition duration-300 mt-1 text-sky-500 text-xs&quot;&gt;Copied!&lt;/div&gt;
    &lt;button
        type=&quot;button&quot;
        title=&quot;Copy to clipboard&quot;
        class=&quot;hidden sm:block p-2 pl-3 transition duration-300&quot;
        @click.prevent=&quot;copyToClipboard&quot;
        :class=&quot;{
            'text-black/30 hover:text-black/80': !showMessage,
            'text-sky-500 hover:text-sky-700': showMessage,
        }&quot;&gt;
        &lt;svg xmlns=&quot;http://www.w3.org/2000/svg&quot; fill=&quot;none&quot; viewBox=&quot;0 0 24 24&quot; stroke-width=&quot;1.5&quot; stroke=&quot;currentColor&quot; class=&quot;block w-6 h-6&quot;&gt;
            &lt;path fill=&quot;white&quot; stroke-linecap=&quot;round&quot; stroke-linejoin=&quot;round&quot; d=&quot;M11.35 3.836c-.065.21-.1.433-.1.664 0 .414.336.75.75.75h4.5a.75.75 0 00.75-.75 2.25 2.25 0 00-.1-.664m-5.8 0A2.251 2.251 0 0113.5 2.25H15c1.012 0 1.867.668 2.15 1.586m-5.8 0c-.376.023-.75.05-1.124.08C9.095 4.01 8.25 4.973 8.25 6.108V8.25m8.9-4.414c.376.023.75.05 1.124.08 1.131.094 1.976 1.057 1.976 2.192V16.5A2.25 2.25 0 0118 18.75h-2.25m-7.5-10.5H4.875c-.621 0-1.125.504-1.125 1.125v11.25c0 .621.504 1.125 1.125 1.125h9.75c.621 0 1.125-.504 1.125-1.125V18.75m-7.5-10.5h6.375c.621 0 1.125.504 1.125 1.125v9.375m-8.25-3l1.5 1.5 3-3.75&quot; /&gt;
        &lt;/svg&gt;
    &lt;/button&gt;
&lt;/div&gt;&lt;pre class=&quot;phiki language-php github-light&quot; data-language=&quot;php&quot; style=&quot;background-color: #fff;color: #24292e;&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;token&quot;&gt;#[&lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #005cc5;&quot;&gt;Renderless&lt;/span&gt;&lt;span class=&quot;token&quot;&gt;]&lt;/span&gt;&lt;span class=&quot;token&quot;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;token&quot; style=&quot;color: #d73a49;&quot;&gt;public&lt;/span&gt;&lt;span class=&quot;token&quot;&gt; &lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #d73a49;&quot;&gt;function&lt;/span&gt;&lt;span class=&quot;token&quot;&gt; &lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #6f42c1;&quot;&gt;checkIssues&lt;/span&gt;&lt;span class=&quot;token&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token&quot;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;token&quot;&gt;{&lt;/span&gt;&lt;span class=&quot;token&quot;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;token&quot;&gt;  &lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #24292e;&quot;&gt;$&lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #24292e;&quot;&gt;records&lt;/span&gt;&lt;span class=&quot;token&quot;&gt; &lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #d73a49;&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;token&quot;&gt; &lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #005cc5;&quot;&gt;$&lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #005cc5;&quot;&gt;this&lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #d73a49;&quot;&gt;-&amp;gt;&lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #24292e;&quot;&gt;zone&lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #d73a49;&quot;&gt;-&amp;gt;&lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #6f42c1;&quot;&gt;records&lt;/span&gt;&lt;span class=&quot;token&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #d73a49;&quot;&gt;-&amp;gt;&lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #6f42c1;&quot;&gt;get&lt;/span&gt;&lt;span class=&quot;token&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token&quot;&gt;;&lt;/span&gt;&lt;span class=&quot;token&quot;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;token&quot;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;token&quot;&gt;  &lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #d73a49;&quot;&gt;foreach&lt;/span&gt;&lt;span class=&quot;token&quot;&gt; &lt;/span&gt;&lt;span class=&quot;token&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #24292e;&quot;&gt;$&lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #24292e;&quot;&gt;records&lt;/span&gt;&lt;span class=&quot;token&quot;&gt; &lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #d73a49;&quot;&gt;as&lt;/span&gt;&lt;span class=&quot;token&quot;&gt; &lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #24292e;&quot;&gt;$&lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #24292e;&quot;&gt;record&lt;/span&gt;&lt;span class=&quot;token&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token&quot;&gt; &lt;/span&gt;&lt;span class=&quot;token&quot;&gt;{&lt;/span&gt;&lt;span class=&quot;token&quot;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;token&quot;&gt;      &lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #6f42c1;&quot;&gt;dispatch&lt;/span&gt;&lt;span class=&quot;token&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #d73a49;&quot;&gt;new&lt;/span&gt;&lt;span class=&quot;token&quot;&gt; &lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #005cc5;&quot;&gt;CheckZoneRecord&lt;/span&gt;&lt;span class=&quot;token&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #24292e;&quot;&gt;$&lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #24292e;&quot;&gt;record&lt;/span&gt;&lt;span class=&quot;token&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token&quot;&gt;;&lt;/span&gt;&lt;span class=&quot;token&quot;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;token&quot;&gt;  &lt;/span&gt;&lt;span class=&quot;token&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;token&quot;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;token&quot;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;token&quot;&gt;  &lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #005cc5;&quot;&gt;Notification&lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #d73a49;&quot;&gt;::&lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #6f42c1;&quot;&gt;make&lt;/span&gt;&lt;span class=&quot;token&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token&quot;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;token&quot;&gt;    &lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #d73a49;&quot;&gt;-&amp;gt;&lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #6f42c1;&quot;&gt;title&lt;/span&gt;&lt;span class=&quot;token&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #032f62;&quot;&gt;&amp;#039;&lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #032f62;&quot;&gt;New issues checks have been requested&lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #032f62;&quot;&gt;&amp;#039;&lt;/span&gt;&lt;span class=&quot;token&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token&quot;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;token&quot;&gt;    &lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #d73a49;&quot;&gt;-&amp;gt;&lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #6f42c1;&quot;&gt;success&lt;/span&gt;&lt;span class=&quot;token&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token&quot;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;token&quot;&gt;    &lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #d73a49;&quot;&gt;-&amp;gt;&lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #6f42c1;&quot;&gt;send&lt;/span&gt;&lt;span class=&quot;token&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token&quot;&gt;;&lt;/span&gt;&lt;span class=&quot;token&quot;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;token&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;token&quot;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;This function does two things:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;Sending &lt;code&gt;CheckZoneRecord&lt;/code&gt; jobs to the queues&lt;/li&gt;
&lt;li&gt;Sending a visual notification, more like a toast, telling the user that the checks have started.&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;Depending on the part of my application, they also receive a notification when the background task is done. But here I have a batch of jobs and there is no way that one job will know and be responsible to send this success notification.&lt;/p&gt;
&lt;p&gt;That was the first challenge: how to tell the user that checks are done? Easy. Use job batch to send a notification when it's done.&lt;/p&gt;
&lt;div x-data=&quot;codeBlock&quot; class=&quot;code-block relative&quot;&gt;&lt;div class=&quot;flex space-x-2 items-center absolute top-0 right-0&quot;&gt;
    &lt;div x-cloak x-show=&quot;showMessage&quot; x-transition class=&quot;py-2 animate-bounce transition duration-300 mt-1 text-sky-500 text-xs&quot;&gt;Copied!&lt;/div&gt;
    &lt;button
        type=&quot;button&quot;
        title=&quot;Copy to clipboard&quot;
        class=&quot;hidden sm:block p-2 pl-3 transition duration-300&quot;
        @click.prevent=&quot;copyToClipboard&quot;
        :class=&quot;{
            'text-black/30 hover:text-black/80': !showMessage,
            'text-sky-500 hover:text-sky-700': showMessage,
        }&quot;&gt;
        &lt;svg xmlns=&quot;http://www.w3.org/2000/svg&quot; fill=&quot;none&quot; viewBox=&quot;0 0 24 24&quot; stroke-width=&quot;1.5&quot; stroke=&quot;currentColor&quot; class=&quot;block w-6 h-6&quot;&gt;
            &lt;path fill=&quot;white&quot; stroke-linecap=&quot;round&quot; stroke-linejoin=&quot;round&quot; d=&quot;M11.35 3.836c-.065.21-.1.433-.1.664 0 .414.336.75.75.75h4.5a.75.75 0 00.75-.75 2.25 2.25 0 00-.1-.664m-5.8 0A2.251 2.251 0 0113.5 2.25H15c1.012 0 1.867.668 2.15 1.586m-5.8 0c-.376.023-.75.05-1.124.08C9.095 4.01 8.25 4.973 8.25 6.108V8.25m8.9-4.414c.376.023.75.05 1.124.08 1.131.094 1.976 1.057 1.976 2.192V16.5A2.25 2.25 0 0118 18.75h-2.25m-7.5-10.5H4.875c-.621 0-1.125.504-1.125 1.125v11.25c0 .621.504 1.125 1.125 1.125h9.75c.621 0 1.125-.504 1.125-1.125V18.75m-7.5-10.5h6.375c.621 0 1.125.504 1.125 1.125v9.375m-8.25-3l1.5 1.5 3-3.75&quot; /&gt;
        &lt;/svg&gt;
    &lt;/button&gt;
&lt;/div&gt;&lt;pre class=&quot;phiki language-php github-light&quot; data-language=&quot;php&quot; style=&quot;background-color: #fff;color: #24292e;&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;token&quot; style=&quot;color: #005cc5;&quot;&gt;Bus&lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #d73a49;&quot;&gt;::&lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #6f42c1;&quot;&gt;batch&lt;/span&gt;&lt;span class=&quot;token&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #24292e;&quot;&gt;$&lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #24292e;&quot;&gt;jobs&lt;/span&gt;&lt;span class=&quot;token&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #d73a49;&quot;&gt;-&amp;gt;&lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #6f42c1;&quot;&gt;finally&lt;/span&gt;&lt;span class=&quot;token&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #d73a49;&quot;&gt;fn&lt;/span&gt;&lt;span class=&quot;token&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token&quot;&gt; &lt;/span&gt;&lt;span class=&quot;token&quot;&gt;=&amp;gt;&lt;/span&gt;&lt;span class=&quot;token&quot;&gt; &lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #6f42c1;&quot;&gt;sendSuccessNotification&lt;/span&gt;&lt;span class=&quot;token&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token&quot;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;But like I said, I already had this kind of user experience in my app.&lt;/p&gt;
&lt;p&gt;I wanted more!&lt;/p&gt;
&lt;p&gt;I wanted a progress bar!&lt;/p&gt;
&lt;h2&gt;&lt;a id=&quot;content-the-solution&quot; href=&quot;#content-the-solution&quot; class=&quot;heading-permalink&quot; aria-hidden=&quot;true&quot; tabindex=&quot;-1&quot; title=&quot;Permalink&quot;&gt;#&lt;/a&gt;The solution&lt;/h2&gt;
&lt;p&gt;I wanted the solution to be as seamless and transparent as possible, but in the end, I had to slightly customize Filament.&lt;/p&gt;
&lt;h3&gt;&lt;a id=&quot;content-customize-filament&quot; href=&quot;#content-customize-filament&quot; class=&quot;heading-permalink&quot; aria-hidden=&quot;true&quot; tabindex=&quot;-1&quot; title=&quot;Permalink&quot;&gt;#&lt;/a&gt;Customize Filament&lt;/h3&gt;
&lt;p&gt;We are going to use our own view for the notifications, so go to &lt;code&gt;AppServiceProvider.php&lt;/code&gt; and thoses lines int the &lt;code&gt;boot()&lt;/code&gt; function:&lt;/p&gt;
&lt;div x-data=&quot;codeBlock&quot; class=&quot;code-block relative&quot;&gt;&lt;div class=&quot;flex space-x-2 items-center absolute top-0 right-0&quot;&gt;
    &lt;div x-cloak x-show=&quot;showMessage&quot; x-transition class=&quot;py-2 animate-bounce transition duration-300 mt-1 text-sky-500 text-xs&quot;&gt;Copied!&lt;/div&gt;
    &lt;button
        type=&quot;button&quot;
        title=&quot;Copy to clipboard&quot;
        class=&quot;hidden sm:block p-2 pl-3 transition duration-300&quot;
        @click.prevent=&quot;copyToClipboard&quot;
        :class=&quot;{
            'text-black/30 hover:text-black/80': !showMessage,
            'text-sky-500 hover:text-sky-700': showMessage,
        }&quot;&gt;
        &lt;svg xmlns=&quot;http://www.w3.org/2000/svg&quot; fill=&quot;none&quot; viewBox=&quot;0 0 24 24&quot; stroke-width=&quot;1.5&quot; stroke=&quot;currentColor&quot; class=&quot;block w-6 h-6&quot;&gt;
            &lt;path fill=&quot;white&quot; stroke-linecap=&quot;round&quot; stroke-linejoin=&quot;round&quot; d=&quot;M11.35 3.836c-.065.21-.1.433-.1.664 0 .414.336.75.75.75h4.5a.75.75 0 00.75-.75 2.25 2.25 0 00-.1-.664m-5.8 0A2.251 2.251 0 0113.5 2.25H15c1.012 0 1.867.668 2.15 1.586m-5.8 0c-.376.023-.75.05-1.124.08C9.095 4.01 8.25 4.973 8.25 6.108V8.25m8.9-4.414c.376.023.75.05 1.124.08 1.131.094 1.976 1.057 1.976 2.192V16.5A2.25 2.25 0 0118 18.75h-2.25m-7.5-10.5H4.875c-.621 0-1.125.504-1.125 1.125v11.25c0 .621.504 1.125 1.125 1.125h9.75c.621 0 1.125-.504 1.125-1.125V18.75m-7.5-10.5h6.375c.621 0 1.125.504 1.125 1.125v9.375m-8.25-3l1.5 1.5 3-3.75&quot; /&gt;
        &lt;/svg&gt;
    &lt;/button&gt;
&lt;/div&gt;&lt;pre class=&quot;phiki language-php github-light&quot; data-language=&quot;php&quot; style=&quot;background-color: #fff;color: #24292e;&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;token&quot; style=&quot;color: #005cc5;&quot;&gt;Notification&lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #d73a49;&quot;&gt;::&lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #6f42c1;&quot;&gt;configureUsing&lt;/span&gt;&lt;span class=&quot;token&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #d73a49;&quot;&gt;function&lt;/span&gt;&lt;span class=&quot;token&quot;&gt; &lt;/span&gt;&lt;span class=&quot;token&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #005cc5;&quot;&gt;Notification&lt;/span&gt;&lt;span class=&quot;token&quot;&gt; &lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #24292e;&quot;&gt;$&lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #24292e;&quot;&gt;notification&lt;/span&gt;&lt;span class=&quot;token&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #d73a49;&quot;&gt;:&lt;/span&gt;&lt;span class=&quot;token&quot;&gt; &lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #d73a49;&quot;&gt;void&lt;/span&gt;&lt;span class=&quot;token&quot;&gt; &lt;/span&gt;&lt;span class=&quot;token&quot;&gt;{&lt;/span&gt;&lt;span class=&quot;token&quot;&gt; 
&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;token&quot;&gt;  &lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #24292e;&quot;&gt;$&lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #24292e;&quot;&gt;notification&lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #d73a49;&quot;&gt;-&amp;gt;&lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #6f42c1;&quot;&gt;view&lt;/span&gt;&lt;span class=&quot;token&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #032f62;&quot;&gt;&amp;#039;&lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #032f62;&quot;&gt;components.notification&lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #032f62;&quot;&gt;&amp;#039;&lt;/span&gt;&lt;span class=&quot;token&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token&quot;&gt;;&lt;/span&gt;&lt;span class=&quot;token&quot;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;token&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;token&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token&quot;&gt;;&lt;/span&gt;&lt;span class=&quot;token&quot;&gt; 
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;Original file:&lt;br /&gt;
&lt;code&gt;vendor/filament/notifications/resources/views/notification.blade.php&lt;/code&gt;&lt;/p&gt;
&lt;p&gt;Now create the component with&lt;/p&gt;
&lt;div x-data=&quot;codeBlock&quot; class=&quot;code-block relative&quot;&gt;&lt;div class=&quot;flex space-x-2 items-center absolute top-0 right-0&quot;&gt;
    &lt;div x-cloak x-show=&quot;showMessage&quot; x-transition class=&quot;py-2 animate-bounce transition duration-300 mt-1 text-sky-500 text-xs&quot;&gt;Copied!&lt;/div&gt;
    &lt;button
        type=&quot;button&quot;
        title=&quot;Copy to clipboard&quot;
        class=&quot;hidden sm:block p-2 pl-3 transition duration-300&quot;
        @click.prevent=&quot;copyToClipboard&quot;
        :class=&quot;{
            'text-black/30 hover:text-black/80': !showMessage,
            'text-sky-500 hover:text-sky-700': showMessage,
        }&quot;&gt;
        &lt;svg xmlns=&quot;http://www.w3.org/2000/svg&quot; fill=&quot;none&quot; viewBox=&quot;0 0 24 24&quot; stroke-width=&quot;1.5&quot; stroke=&quot;currentColor&quot; class=&quot;block w-6 h-6&quot;&gt;
            &lt;path fill=&quot;white&quot; stroke-linecap=&quot;round&quot; stroke-linejoin=&quot;round&quot; d=&quot;M11.35 3.836c-.065.21-.1.433-.1.664 0 .414.336.75.75.75h4.5a.75.75 0 00.75-.75 2.25 2.25 0 00-.1-.664m-5.8 0A2.251 2.251 0 0113.5 2.25H15c1.012 0 1.867.668 2.15 1.586m-5.8 0c-.376.023-.75.05-1.124.08C9.095 4.01 8.25 4.973 8.25 6.108V8.25m8.9-4.414c.376.023.75.05 1.124.08 1.131.094 1.976 1.057 1.976 2.192V16.5A2.25 2.25 0 0118 18.75h-2.25m-7.5-10.5H4.875c-.621 0-1.125.504-1.125 1.125v11.25c0 .621.504 1.125 1.125 1.125h9.75c.621 0 1.125-.504 1.125-1.125V18.75m-7.5-10.5h6.375c.621 0 1.125.504 1.125 1.125v9.375m-8.25-3l1.5 1.5 3-3.75&quot; /&gt;
        &lt;/svg&gt;
    &lt;/button&gt;
&lt;/div&gt;&lt;pre class=&quot;phiki language-shellscript github-light&quot; data-language=&quot;shellscript&quot; style=&quot;background-color: #fff;color: #24292e;&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;token&quot; style=&quot;color: #6f42c1;&quot;&gt;php&lt;/span&gt;&lt;span class=&quot;token&quot;&gt; &lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #032f62;&quot;&gt;artisan&lt;/span&gt;&lt;span class=&quot;token&quot;&gt; &lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #032f62;&quot;&gt;make:component&lt;/span&gt;&lt;span class=&quot;token&quot;&gt; &lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #032f62;&quot;&gt;notification&lt;/span&gt;&lt;span class=&quot;token&quot;&gt; &lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #005cc5;&quot;&gt;-&lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #005cc5;&quot;&gt;-view&lt;/span&gt;&lt;span class=&quot;token&quot;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;Copy and paste the content of the original file and and modify the body part:&lt;/p&gt;
&lt;div x-data=&quot;codeBlock&quot; class=&quot;code-block relative&quot;&gt;&lt;div class=&quot;flex space-x-2 items-center absolute top-0 right-0&quot;&gt;
    &lt;div x-cloak x-show=&quot;showMessage&quot; x-transition class=&quot;py-2 animate-bounce transition duration-300 mt-1 text-sky-500 text-xs&quot;&gt;Copied!&lt;/div&gt;
    &lt;button
        type=&quot;button&quot;
        title=&quot;Copy to clipboard&quot;
        class=&quot;hidden sm:block p-2 pl-3 transition duration-300&quot;
        @click.prevent=&quot;copyToClipboard&quot;
        :class=&quot;{
            'text-black/30 hover:text-black/80': !showMessage,
            'text-sky-500 hover:text-sky-700': showMessage,
        }&quot;&gt;
        &lt;svg xmlns=&quot;http://www.w3.org/2000/svg&quot; fill=&quot;none&quot; viewBox=&quot;0 0 24 24&quot; stroke-width=&quot;1.5&quot; stroke=&quot;currentColor&quot; class=&quot;block w-6 h-6&quot;&gt;
            &lt;path fill=&quot;white&quot; stroke-linecap=&quot;round&quot; stroke-linejoin=&quot;round&quot; d=&quot;M11.35 3.836c-.065.21-.1.433-.1.664 0 .414.336.75.75.75h4.5a.75.75 0 00.75-.75 2.25 2.25 0 00-.1-.664m-5.8 0A2.251 2.251 0 0113.5 2.25H15c1.012 0 1.867.668 2.15 1.586m-5.8 0c-.376.023-.75.05-1.124.08C9.095 4.01 8.25 4.973 8.25 6.108V8.25m8.9-4.414c.376.023.75.05 1.124.08 1.131.094 1.976 1.057 1.976 2.192V16.5A2.25 2.25 0 0118 18.75h-2.25m-7.5-10.5H4.875c-.621 0-1.125.504-1.125 1.125v11.25c0 .621.504 1.125 1.125 1.125h9.75c.621 0 1.125-.504 1.125-1.125V18.75m-7.5-10.5h6.375c.621 0 1.125.504 1.125 1.125v9.375m-8.25-3l1.5 1.5 3-3.75&quot; /&gt;
        &lt;/svg&gt;
    &lt;/button&gt;
&lt;/div&gt;&lt;pre class=&quot;phiki language-php github-light&quot; data-language=&quot;php&quot; style=&quot;background-color: #fff;color: #24292e;&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;token&quot; style=&quot;color: #d73a49;&quot;&gt;@&lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #005cc5;&quot;&gt;php&lt;/span&gt;&lt;span class=&quot;token&quot;&gt; 
&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;token&quot;&gt;    &lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #d73a49;&quot;&gt;use&lt;/span&gt;&lt;span class=&quot;token&quot;&gt; &lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #005cc5;&quot;&gt;Filament&lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #005cc5;&quot;&gt;\&lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #005cc5;&quot;&gt;Notifications&lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #005cc5;&quot;&gt;\&lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #005cc5;&quot;&gt;Livewire&lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #005cc5;&quot;&gt;\&lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #005cc5;&quot;&gt;Notifications&lt;/span&gt;&lt;span class=&quot;token&quot;&gt;;&lt;/span&gt;&lt;span class=&quot;token&quot;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;token&quot;&gt;    &lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #d73a49;&quot;&gt;use&lt;/span&gt;&lt;span class=&quot;token&quot;&gt; &lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #005cc5;&quot;&gt;Filament&lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #005cc5;&quot;&gt;\&lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #005cc5;&quot;&gt;Support&lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #005cc5;&quot;&gt;\&lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #005cc5;&quot;&gt;Enums&lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #005cc5;&quot;&gt;\&lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #005cc5;&quot;&gt;Alignment&lt;/span&gt;&lt;span class=&quot;token&quot;&gt;;&lt;/span&gt;&lt;span class=&quot;token&quot;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;token&quot;&gt;    &lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #d73a49;&quot;&gt;use&lt;/span&gt;&lt;span class=&quot;token&quot;&gt; &lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #005cc5;&quot;&gt;Filament&lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #005cc5;&quot;&gt;\&lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #005cc5;&quot;&gt;Support&lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #005cc5;&quot;&gt;\&lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #005cc5;&quot;&gt;Enums&lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #005cc5;&quot;&gt;\&lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #005cc5;&quot;&gt;VerticalAlignment&lt;/span&gt;&lt;span class=&quot;token&quot;&gt;;&lt;/span&gt;&lt;span class=&quot;token&quot;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;token&quot;&gt;    &lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #d73a49;&quot;&gt;use&lt;/span&gt;&lt;span class=&quot;token&quot;&gt; &lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #005cc5;&quot;&gt;Illuminate&lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #005cc5;&quot;&gt;\&lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #005cc5;&quot;&gt;Support&lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #005cc5;&quot;&gt;\&lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #005cc5;&quot;&gt;Arr&lt;/span&gt;&lt;span class=&quot;token&quot;&gt;;&lt;/span&gt;&lt;span class=&quot;token&quot;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;token&quot;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;token&quot;&gt;    &lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #24292e;&quot;&gt;$&lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #24292e;&quot;&gt;color&lt;/span&gt;&lt;span class=&quot;token&quot;&gt; &lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #d73a49;&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;token&quot;&gt; &lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #24292e;&quot;&gt;$&lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #24292e;&quot;&gt;getColor&lt;/span&gt;&lt;span class=&quot;token&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token&quot;&gt; &lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #d73a49;&quot;&gt;??&lt;/span&gt;&lt;span class=&quot;token&quot;&gt; &lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #032f62;&quot;&gt;&amp;#039;&lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #032f62;&quot;&gt;gray&lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #032f62;&quot;&gt;&amp;#039;&lt;/span&gt;&lt;span class=&quot;token&quot;&gt;;&lt;/span&gt;&lt;span class=&quot;token&quot;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;token&quot;&gt;    &lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #24292e;&quot;&gt;$&lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #24292e;&quot;&gt;isInline&lt;/span&gt;&lt;span class=&quot;token&quot;&gt; &lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #d73a49;&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;token&quot;&gt; &lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #24292e;&quot;&gt;$&lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #24292e;&quot;&gt;isInline&lt;/span&gt;&lt;span class=&quot;token&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token&quot;&gt;;&lt;/span&gt;&lt;span class=&quot;token&quot;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;token&quot;&gt;    &lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #24292e;&quot;&gt;$&lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #24292e;&quot;&gt;status&lt;/span&gt;&lt;span class=&quot;token&quot;&gt; &lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #d73a49;&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;token&quot;&gt; &lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #24292e;&quot;&gt;$&lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #24292e;&quot;&gt;getStatus&lt;/span&gt;&lt;span class=&quot;token&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token&quot;&gt;;&lt;/span&gt;&lt;span class=&quot;token&quot;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;token&quot;&gt;    &lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #24292e;&quot;&gt;$&lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #24292e;&quot;&gt;title&lt;/span&gt;&lt;span class=&quot;token&quot;&gt; &lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #d73a49;&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;token&quot;&gt; &lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #24292e;&quot;&gt;$&lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #24292e;&quot;&gt;getTitle&lt;/span&gt;&lt;span class=&quot;token&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token&quot;&gt;;&lt;/span&gt;&lt;span class=&quot;token&quot;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;token&quot;&gt;    &lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #24292e;&quot;&gt;$&lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #24292e;&quot;&gt;hasTitle&lt;/span&gt;&lt;span class=&quot;token&quot;&gt; &lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #d73a49;&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;token&quot;&gt; &lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #6f42c1;&quot;&gt;filled&lt;/span&gt;&lt;span class=&quot;token&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #24292e;&quot;&gt;$&lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #24292e;&quot;&gt;title&lt;/span&gt;&lt;span class=&quot;token&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token&quot;&gt;;&lt;/span&gt;&lt;span class=&quot;token&quot;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;token&quot;&gt;    &lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #24292e;&quot;&gt;$&lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #24292e;&quot;&gt;date&lt;/span&gt;&lt;span class=&quot;token&quot;&gt; &lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #d73a49;&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;token&quot;&gt; &lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #24292e;&quot;&gt;$&lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #24292e;&quot;&gt;getDate&lt;/span&gt;&lt;span class=&quot;token&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token&quot;&gt;;&lt;/span&gt;&lt;span class=&quot;token&quot;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;token&quot;&gt;    &lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #24292e;&quot;&gt;$&lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #24292e;&quot;&gt;hasDate&lt;/span&gt;&lt;span class=&quot;token&quot;&gt; &lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #d73a49;&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;token&quot;&gt; &lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #6f42c1;&quot;&gt;filled&lt;/span&gt;&lt;span class=&quot;token&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #24292e;&quot;&gt;$&lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #24292e;&quot;&gt;date&lt;/span&gt;&lt;span class=&quot;token&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token&quot;&gt;;&lt;/span&gt;&lt;span class=&quot;token&quot;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;token&quot;&gt;    &lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #24292e;&quot;&gt;$&lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #24292e;&quot;&gt;body&lt;/span&gt;&lt;span class=&quot;token&quot;&gt; &lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #d73a49;&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;token&quot;&gt; &lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #24292e;&quot;&gt;$&lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #24292e;&quot;&gt;getBody&lt;/span&gt;&lt;span class=&quot;token&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token&quot;&gt;;&lt;/span&gt;&lt;span class=&quot;token&quot;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;token&quot;&gt;    &lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #24292e;&quot;&gt;$&lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #24292e;&quot;&gt;hasBody&lt;/span&gt;&lt;span class=&quot;token&quot;&gt; &lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #d73a49;&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;token&quot;&gt; &lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #6f42c1;&quot;&gt;filled&lt;/span&gt;&lt;span class=&quot;token&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #24292e;&quot;&gt;$&lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #24292e;&quot;&gt;body&lt;/span&gt;&lt;span class=&quot;token&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token&quot;&gt;;&lt;/span&gt;&lt;span class=&quot;token&quot;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;token&quot; style=&quot;color: #d73a49;&quot;&gt;@&lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #005cc5;&quot;&gt;endphp&lt;/span&gt;&lt;span class=&quot;token&quot;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;token&quot;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;token&quot; style=&quot;color: #d73a49;&quot;&gt;&amp;lt;&lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #005cc5;&quot;&gt;x&lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #d73a49;&quot;&gt;-&lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #005cc5;&quot;&gt;filament&lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #d73a49;&quot;&gt;-&lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #005cc5;&quot;&gt;notifications&lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #d73a49;&quot;&gt;::&lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #005cc5;&quot;&gt;notification&lt;/span&gt;&lt;span class=&quot;token&quot;&gt; 
&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;token&quot;&gt;    &lt;/span&gt;&lt;span class=&quot;token&quot;&gt;:&lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #005cc5;&quot;&gt;notification&lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #d73a49;&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #032f62;&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #032f62;&quot;&gt;$&lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #24292e;&quot;&gt;notification&lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #032f62;&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span class=&quot;token&quot;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;token&quot;&gt;    &lt;/span&gt;&lt;span class=&quot;token&quot;&gt;:&lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #005cc5;&quot;&gt;x&lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #d73a49;&quot;&gt;-&lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #005cc5;&quot;&gt;transition&lt;/span&gt;&lt;span class=&quot;token&quot;&gt;:&lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #005cc5;&quot;&gt;enter&lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #d73a49;&quot;&gt;-&lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #005cc5;&quot;&gt;start&lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #d73a49;&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #032f62;&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #032f62;&quot;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;token&quot; style=&quot;color: #032f62;&quot;&gt;        Arr::toCssClasses([
&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;token&quot; style=&quot;color: #032f62;&quot;&gt;            &amp;#039;opacity-0&amp;#039;,
&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;token&quot; style=&quot;color: #032f62;&quot;&gt;            (&lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #032f62;&quot;&gt;$&lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #24292e;&quot;&gt;this&lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #032f62;&quot;&gt; &lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #032f62;&quot;&gt;instanceof Notifications)
&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;token&quot; style=&quot;color: #032f62;&quot;&gt;            ? match (static::&lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #032f62;&quot;&gt;$&lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #24292e;&quot;&gt;alignment&lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #032f62;&quot;&gt;) {
&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;token&quot; style=&quot;color: #032f62;&quot;&gt;                Alignment::Start, Alignment::Left =&amp;gt; &amp;#039;-translate-x-12&amp;#039;,
&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;token&quot; style=&quot;color: #032f62;&quot;&gt;                Alignment::End, Alignment::Right =&amp;gt; &amp;#039;translate-x-12&amp;#039;,
&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;token&quot; style=&quot;color: #032f62;&quot;&gt;                Alignment::Center =&amp;gt; match (static::&lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #032f62;&quot;&gt;$&lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #24292e;&quot;&gt;verticalAlignment&lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #032f62;&quot;&gt;) {
&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;token&quot; style=&quot;color: #032f62;&quot;&gt;                    VerticalAlignment::Start =&amp;gt; &amp;#039;-translate-y-12&amp;#039;,
&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;token&quot; style=&quot;color: #032f62;&quot;&gt;                    VerticalAlignment::End =&amp;gt; &amp;#039;translate-y-12&amp;#039;,
&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;token&quot; style=&quot;color: #032f62;&quot;&gt;                    default =&amp;gt; null,
&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;token&quot; style=&quot;color: #032f62;&quot;&gt;                },
&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;token&quot; style=&quot;color: #032f62;&quot;&gt;                default =&amp;gt; null,
&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;token&quot; style=&quot;color: #032f62;&quot;&gt;            }
&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;token&quot; style=&quot;color: #032f62;&quot;&gt;            : null,
&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;token&quot; style=&quot;color: #032f62;&quot;&gt;        ])
&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;token&quot; style=&quot;color: #032f62;&quot;&gt;    &lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #032f62;&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span class=&quot;token&quot;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;token&quot;&gt;    &lt;/span&gt;&lt;span class=&quot;token&quot;&gt;:&lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #005cc5;&quot;&gt;x&lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #d73a49;&quot;&gt;-&lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #005cc5;&quot;&gt;transition&lt;/span&gt;&lt;span class=&quot;token&quot;&gt;:&lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #005cc5;&quot;&gt;leave&lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #d73a49;&quot;&gt;-&lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #005cc5;&quot;&gt;end&lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #d73a49;&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #032f62;&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #032f62;&quot;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;token&quot; style=&quot;color: #032f62;&quot;&gt;        Arr::toCssClasses([
&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;token&quot; style=&quot;color: #032f62;&quot;&gt;            &amp;#039;opacity-0&amp;#039;,
&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;token&quot; style=&quot;color: #032f62;&quot;&gt;            &amp;#039;scale-95&amp;#039; =&amp;gt; ! &lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #032f62;&quot;&gt;$&lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #24292e;&quot;&gt;isInline&lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #032f62;&quot;&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;token&quot; style=&quot;color: #032f62;&quot;&gt;        ])
&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;token&quot; style=&quot;color: #032f62;&quot;&gt;    &lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #032f62;&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span class=&quot;token&quot;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;token&quot;&gt;    &lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #d73a49;&quot;&gt;@&lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #d73a49;&quot;&gt;class&lt;/span&gt;&lt;span class=&quot;token&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;token&quot;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;token&quot;&gt;        &lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #032f62;&quot;&gt;&amp;#039;&lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #032f62;&quot;&gt;fi-no-notification w-full overflow-hidden transition duration-300&lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #032f62;&quot;&gt;&amp;#039;&lt;/span&gt;&lt;span class=&quot;token&quot;&gt;,&lt;/span&gt;&lt;span class=&quot;token&quot;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;token&quot;&gt;        &lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #d73a49;&quot;&gt;...&lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #d73a49;&quot;&gt;match&lt;/span&gt;&lt;span class=&quot;token&quot;&gt; &lt;/span&gt;&lt;span class=&quot;token&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #24292e;&quot;&gt;$&lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #24292e;&quot;&gt;isInline&lt;/span&gt;&lt;span class=&quot;token&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token&quot;&gt; &lt;/span&gt;&lt;span class=&quot;token&quot;&gt;{&lt;/span&gt;&lt;span class=&quot;token&quot;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;token&quot;&gt;            &lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #005cc5;&quot;&gt;true&lt;/span&gt;&lt;span class=&quot;token&quot;&gt; &lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #d73a49;&quot;&gt;=&amp;gt;&lt;/span&gt;&lt;span class=&quot;token&quot;&gt; &lt;/span&gt;&lt;span class=&quot;token&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;token&quot;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;token&quot;&gt;                &lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #032f62;&quot;&gt;&amp;#039;&lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #032f62;&quot;&gt;fi-inline&lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #032f62;&quot;&gt;&amp;#039;&lt;/span&gt;&lt;span class=&quot;token&quot;&gt;,&lt;/span&gt;&lt;span class=&quot;token&quot;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;token&quot;&gt;            &lt;/span&gt;&lt;span class=&quot;token&quot;&gt;]&lt;/span&gt;&lt;span class=&quot;token&quot;&gt;,&lt;/span&gt;&lt;span class=&quot;token&quot;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;token&quot;&gt;            &lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #005cc5;&quot;&gt;false&lt;/span&gt;&lt;span class=&quot;token&quot;&gt; &lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #d73a49;&quot;&gt;=&amp;gt;&lt;/span&gt;&lt;span class=&quot;token&quot;&gt; &lt;/span&gt;&lt;span class=&quot;token&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;token&quot;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;token&quot;&gt;                &lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #032f62;&quot;&gt;&amp;#039;&lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #032f62;&quot;&gt;max-w-sm rounded-xl bg-white shadow-lg ring-1 dark:bg-gray-900&lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #032f62;&quot;&gt;&amp;#039;&lt;/span&gt;&lt;span class=&quot;token&quot;&gt;,&lt;/span&gt;&lt;span class=&quot;token&quot;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;token&quot;&gt;                &lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #d73a49;&quot;&gt;match&lt;/span&gt;&lt;span class=&quot;token&quot;&gt; &lt;/span&gt;&lt;span class=&quot;token&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #24292e;&quot;&gt;$&lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #24292e;&quot;&gt;color&lt;/span&gt;&lt;span class=&quot;token&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token&quot;&gt; &lt;/span&gt;&lt;span class=&quot;token&quot;&gt;{&lt;/span&gt;&lt;span class=&quot;token&quot;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;token&quot;&gt;                    &lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #032f62;&quot;&gt;&amp;#039;&lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #032f62;&quot;&gt;gray&lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #032f62;&quot;&gt;&amp;#039;&lt;/span&gt;&lt;span class=&quot;token&quot;&gt; &lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #d73a49;&quot;&gt;=&amp;gt;&lt;/span&gt;&lt;span class=&quot;token&quot;&gt; &lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #032f62;&quot;&gt;&amp;#039;&lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #032f62;&quot;&gt;ring-gray-950/5 dark:ring-white/10&lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #032f62;&quot;&gt;&amp;#039;&lt;/span&gt;&lt;span class=&quot;token&quot;&gt;,&lt;/span&gt;&lt;span class=&quot;token&quot;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;token&quot;&gt;                    &lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #d73a49;&quot;&gt;default&lt;/span&gt;&lt;span class=&quot;token&quot;&gt; &lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #d73a49;&quot;&gt;=&amp;gt;&lt;/span&gt;&lt;span class=&quot;token&quot;&gt; &lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #032f62;&quot;&gt;&amp;#039;&lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #032f62;&quot;&gt;fi-color-custom ring-custom-600/20 dark:ring-custom-400/30&lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #032f62;&quot;&gt;&amp;#039;&lt;/span&gt;&lt;span class=&quot;token&quot;&gt;,&lt;/span&gt;&lt;span class=&quot;token&quot;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;token&quot;&gt;                &lt;/span&gt;&lt;span class=&quot;token&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;token&quot;&gt;,&lt;/span&gt;&lt;span class=&quot;token&quot;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;token&quot;&gt;                &lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #005cc5;&quot;&gt;is_string&lt;/span&gt;&lt;span class=&quot;token&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #24292e;&quot;&gt;$&lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #24292e;&quot;&gt;color&lt;/span&gt;&lt;span class=&quot;token&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token&quot;&gt; &lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #d73a49;&quot;&gt;?&lt;/span&gt;&lt;span class=&quot;token&quot;&gt; &lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #032f62;&quot;&gt;&amp;#039;&lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #032f62;&quot;&gt;fi-color-&lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #032f62;&quot;&gt;&amp;#039;&lt;/span&gt;&lt;span class=&quot;token&quot;&gt; &lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #d73a49;&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token&quot;&gt; &lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #24292e;&quot;&gt;$&lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #24292e;&quot;&gt;color&lt;/span&gt;&lt;span class=&quot;token&quot;&gt; &lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #d73a49;&quot;&gt;:&lt;/span&gt;&lt;span class=&quot;token&quot;&gt; &lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #005cc5;&quot;&gt;null&lt;/span&gt;&lt;span class=&quot;token&quot;&gt;,&lt;/span&gt;&lt;span class=&quot;token&quot;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;token&quot;&gt;                &lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #032f62;&quot;&gt;&amp;#039;&lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #032f62;&quot;&gt;fi-status-&lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #032f62;&quot;&gt;&amp;#039;&lt;/span&gt;&lt;span class=&quot;token&quot;&gt; &lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #d73a49;&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token&quot;&gt; &lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #24292e;&quot;&gt;$&lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #24292e;&quot;&gt;status&lt;/span&gt;&lt;span class=&quot;token&quot;&gt; &lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #d73a49;&quot;&gt;=&amp;gt;&lt;/span&gt;&lt;span class=&quot;token&quot;&gt; &lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #24292e;&quot;&gt;$&lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #24292e;&quot;&gt;status&lt;/span&gt;&lt;span class=&quot;token&quot;&gt;,&lt;/span&gt;&lt;span class=&quot;token&quot;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;token&quot;&gt;            &lt;/span&gt;&lt;span class=&quot;token&quot;&gt;]&lt;/span&gt;&lt;span class=&quot;token&quot;&gt;,&lt;/span&gt;&lt;span class=&quot;token&quot;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;token&quot;&gt;        &lt;/span&gt;&lt;span class=&quot;token&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;token&quot;&gt;,&lt;/span&gt;&lt;span class=&quot;token&quot;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;token&quot;&gt;    &lt;/span&gt;&lt;span class=&quot;token&quot;&gt;]&lt;/span&gt;&lt;span class=&quot;token&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token&quot;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;token&quot;&gt;    &lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #d73a49;&quot;&gt;@&lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #6f42c1;&quot;&gt;style&lt;/span&gt;&lt;span class=&quot;token&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;token&quot;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;token&quot;&gt;        &lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #005cc5;&quot;&gt;\&lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #005cc5;&quot;&gt;Filament&lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #005cc5;&quot;&gt;\&lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #005cc5;&quot;&gt;Support&lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #005cc5;&quot;&gt;\&lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #6f42c1;&quot;&gt;get_color_css_variables&lt;/span&gt;&lt;span class=&quot;token&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token&quot;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;token&quot;&gt;            &lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #24292e;&quot;&gt;$&lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #24292e;&quot;&gt;color&lt;/span&gt;&lt;span class=&quot;token&quot;&gt;,&lt;/span&gt;&lt;span class=&quot;token&quot;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;token&quot;&gt;            &lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #6f42c1;&quot;&gt;shades&lt;/span&gt;&lt;span class=&quot;token&quot;&gt;:&lt;/span&gt;&lt;span class=&quot;token&quot;&gt; &lt;/span&gt;&lt;span class=&quot;token&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #005cc5;&quot;&gt;50&lt;/span&gt;&lt;span class=&quot;token&quot;&gt;,&lt;/span&gt;&lt;span class=&quot;token&quot;&gt; &lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #005cc5;&quot;&gt;400&lt;/span&gt;&lt;span class=&quot;token&quot;&gt;,&lt;/span&gt;&lt;span class=&quot;token&quot;&gt; &lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #005cc5;&quot;&gt;600&lt;/span&gt;&lt;span class=&quot;token&quot;&gt;]&lt;/span&gt;&lt;span class=&quot;token&quot;&gt;,&lt;/span&gt;&lt;span class=&quot;token&quot;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;token&quot;&gt;            &lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #6f42c1;&quot;&gt;alias&lt;/span&gt;&lt;span class=&quot;token&quot;&gt;:&lt;/span&gt;&lt;span class=&quot;token&quot;&gt; &lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #032f62;&quot;&gt;&amp;#039;&lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #032f62;&quot;&gt;notifications::notification&lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #032f62;&quot;&gt;&amp;#039;&lt;/span&gt;&lt;span class=&quot;token&quot;&gt;,&lt;/span&gt;&lt;span class=&quot;token&quot;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;token&quot;&gt;        &lt;/span&gt;&lt;span class=&quot;token&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token&quot;&gt; &lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #d73a49;&quot;&gt;=&amp;gt;&lt;/span&gt;&lt;span class=&quot;token&quot;&gt; &lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #d73a49;&quot;&gt;!&lt;/span&gt;&lt;span class=&quot;token&quot;&gt; &lt;/span&gt;&lt;span class=&quot;token&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #24292e;&quot;&gt;$&lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #24292e;&quot;&gt;isInline&lt;/span&gt;&lt;span class=&quot;token&quot;&gt; &lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #d73a49;&quot;&gt;||&lt;/span&gt;&lt;span class=&quot;token&quot;&gt; &lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #24292e;&quot;&gt;$&lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #24292e;&quot;&gt;color&lt;/span&gt;&lt;span class=&quot;token&quot;&gt; &lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #d73a49;&quot;&gt;===&lt;/span&gt;&lt;span class=&quot;token&quot;&gt; &lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #032f62;&quot;&gt;&amp;#039;&lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #032f62;&quot;&gt;gray&lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #032f62;&quot;&gt;&amp;#039;&lt;/span&gt;&lt;span class=&quot;token&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token&quot;&gt;,&lt;/span&gt;&lt;span class=&quot;token&quot;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;token&quot;&gt;    &lt;/span&gt;&lt;span class=&quot;token&quot;&gt;]&lt;/span&gt;&lt;span class=&quot;token&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token&quot;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;token&quot; style=&quot;color: #d73a49;&quot;&gt;&amp;gt;&lt;/span&gt;&lt;span class=&quot;token&quot;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;token&quot;&gt;    &lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #d73a49;&quot;&gt;&amp;lt;&lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #005cc5;&quot;&gt;div&lt;/span&gt;&lt;span class=&quot;token&quot;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;token&quot;&gt;        &lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #d73a49;&quot;&gt;@&lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #d73a49;&quot;&gt;class&lt;/span&gt;&lt;span class=&quot;token&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;token&quot;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;token&quot;&gt;            &lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #032f62;&quot;&gt;&amp;#039;&lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #032f62;&quot;&gt;flex w-full gap-3 p-4&lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #032f62;&quot;&gt;&amp;#039;&lt;/span&gt;&lt;span class=&quot;token&quot;&gt;,&lt;/span&gt;&lt;span class=&quot;token&quot;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;token&quot;&gt;            &lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #d73a49;&quot;&gt;match&lt;/span&gt;&lt;span class=&quot;token&quot;&gt; &lt;/span&gt;&lt;span class=&quot;token&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #24292e;&quot;&gt;$&lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #24292e;&quot;&gt;color&lt;/span&gt;&lt;span class=&quot;token&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token&quot;&gt; &lt;/span&gt;&lt;span class=&quot;token&quot;&gt;{&lt;/span&gt;&lt;span class=&quot;token&quot;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;token&quot;&gt;                &lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #032f62;&quot;&gt;&amp;#039;&lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #032f62;&quot;&gt;gray&lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #032f62;&quot;&gt;&amp;#039;&lt;/span&gt;&lt;span class=&quot;token&quot;&gt; &lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #d73a49;&quot;&gt;=&amp;gt;&lt;/span&gt;&lt;span class=&quot;token&quot;&gt; &lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #005cc5;&quot;&gt;null&lt;/span&gt;&lt;span class=&quot;token&quot;&gt;,&lt;/span&gt;&lt;span class=&quot;token&quot;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;token&quot;&gt;                &lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #d73a49;&quot;&gt;default&lt;/span&gt;&lt;span class=&quot;token&quot;&gt; &lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #d73a49;&quot;&gt;=&amp;gt;&lt;/span&gt;&lt;span class=&quot;token&quot;&gt; &lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #032f62;&quot;&gt;&amp;#039;&lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #032f62;&quot;&gt;bg-custom-50 dark:bg-custom-400/10&lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #032f62;&quot;&gt;&amp;#039;&lt;/span&gt;&lt;span class=&quot;token&quot;&gt;,&lt;/span&gt;&lt;span class=&quot;token&quot;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;token&quot;&gt;            &lt;/span&gt;&lt;span class=&quot;token&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;token&quot;&gt;,&lt;/span&gt;&lt;span class=&quot;token&quot;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;token&quot;&gt;        &lt;/span&gt;&lt;span class=&quot;token&quot;&gt;]&lt;/span&gt;&lt;span class=&quot;token&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token&quot;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;token&quot;&gt;    &lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #d73a49;&quot;&gt;&amp;gt;&lt;/span&gt;&lt;span class=&quot;token&quot;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;token&quot;&gt;        &lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #d73a49;&quot;&gt;@&lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #d73a49;&quot;&gt;if&lt;/span&gt;&lt;span class=&quot;token&quot;&gt; &lt;/span&gt;&lt;span class=&quot;token&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #24292e;&quot;&gt;$&lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #24292e;&quot;&gt;icon&lt;/span&gt;&lt;span class=&quot;token&quot;&gt; &lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #d73a49;&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;token&quot;&gt; &lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #24292e;&quot;&gt;$&lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #24292e;&quot;&gt;getIcon&lt;/span&gt;&lt;span class=&quot;token&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token&quot;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;token&quot;&gt;            &lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #d73a49;&quot;&gt;&amp;lt;&lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #005cc5;&quot;&gt;x&lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #d73a49;&quot;&gt;-&lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #005cc5;&quot;&gt;filament&lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #d73a49;&quot;&gt;-&lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #005cc5;&quot;&gt;notifications&lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #d73a49;&quot;&gt;::&lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #005cc5;&quot;&gt;icon&lt;/span&gt;&lt;span class=&quot;token&quot;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;token&quot;&gt;                &lt;/span&gt;&lt;span class=&quot;token&quot;&gt;:&lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #005cc5;&quot;&gt;color&lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #d73a49;&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #032f62;&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #032f62;&quot;&gt;$&lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #24292e;&quot;&gt;getIconColor&lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #032f62;&quot;&gt;()&lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #032f62;&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span class=&quot;token&quot;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;token&quot;&gt;                &lt;/span&gt;&lt;span class=&quot;token&quot;&gt;:&lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #005cc5;&quot;&gt;icon&lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #d73a49;&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #032f62;&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #032f62;&quot;&gt;$&lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #24292e;&quot;&gt;icon&lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #032f62;&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span class=&quot;token&quot;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;token&quot;&gt;                &lt;/span&gt;&lt;span class=&quot;token&quot;&gt;:&lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #005cc5;&quot;&gt;size&lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #d73a49;&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #032f62;&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #032f62;&quot;&gt;$&lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #24292e;&quot;&gt;getIconSize&lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #032f62;&quot;&gt;()&lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #032f62;&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span class=&quot;token&quot;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;token&quot;&gt;            &lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #d73a49;&quot;&gt;/&lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #d73a49;&quot;&gt;&amp;gt;&lt;/span&gt;&lt;span class=&quot;token&quot;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;token&quot;&gt;        &lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #d73a49;&quot;&gt;@&lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #d73a49;&quot;&gt;endif&lt;/span&gt;&lt;span class=&quot;token&quot;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;token&quot;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;token&quot;&gt;        &lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #d73a49;&quot;&gt;&amp;lt;&lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #005cc5;&quot;&gt;div&lt;/span&gt;&lt;span class=&quot;token&quot;&gt; &lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #d73a49;&quot;&gt;class&lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #d73a49;&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #032f62;&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #032f62;&quot;&gt;mt-0.5 grid flex-1&lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #032f62;&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #d73a49;&quot;&gt;&amp;gt;&lt;/span&gt;&lt;span class=&quot;token&quot;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;token&quot;&gt;                  
&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;token&quot;&gt;            &lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #d73a49;&quot;&gt;@&lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #d73a49;&quot;&gt;if&lt;/span&gt;&lt;span class=&quot;token&quot;&gt; &lt;/span&gt;&lt;span class=&quot;token&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #24292e;&quot;&gt;$&lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #24292e;&quot;&gt;hasTitle&lt;/span&gt;&lt;span class=&quot;token&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token&quot;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;token&quot;&gt;                &lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #d73a49;&quot;&gt;&amp;lt;&lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #005cc5;&quot;&gt;x&lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #d73a49;&quot;&gt;-&lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #005cc5;&quot;&gt;filament&lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #d73a49;&quot;&gt;-&lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #005cc5;&quot;&gt;notifications&lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #d73a49;&quot;&gt;::&lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #005cc5;&quot;&gt;title&lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #d73a49;&quot;&gt;&amp;gt;&lt;/span&gt;&lt;span class=&quot;token&quot;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;token&quot;&gt;                    &lt;/span&gt;&lt;span class=&quot;token&quot;&gt;{&lt;/span&gt;&lt;span class=&quot;token&quot;&gt;{&lt;/span&gt;&lt;span class=&quot;token&quot;&gt; &lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #6f42c1;&quot;&gt;str&lt;/span&gt;&lt;span class=&quot;token&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #24292e;&quot;&gt;$&lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #24292e;&quot;&gt;title&lt;/span&gt;&lt;span class=&quot;token&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #d73a49;&quot;&gt;-&amp;gt;&lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #6f42c1;&quot;&gt;sanitizeHtml&lt;/span&gt;&lt;span class=&quot;token&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #d73a49;&quot;&gt;-&amp;gt;&lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #6f42c1;&quot;&gt;toHtmlString&lt;/span&gt;&lt;span class=&quot;token&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token&quot;&gt; &lt;/span&gt;&lt;span class=&quot;token&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;token&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;token&quot;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;token&quot;&gt;                &lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #d73a49;&quot;&gt;&amp;lt;&lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #d73a49;&quot;&gt;/&lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #005cc5;&quot;&gt;x&lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #d73a49;&quot;&gt;-&lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #005cc5;&quot;&gt;filament&lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #d73a49;&quot;&gt;-&lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #005cc5;&quot;&gt;notifications&lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #d73a49;&quot;&gt;::&lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #005cc5;&quot;&gt;title&lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #d73a49;&quot;&gt;&amp;gt;&lt;/span&gt;&lt;span class=&quot;token&quot;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;token&quot;&gt;            &lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #d73a49;&quot;&gt;@&lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #d73a49;&quot;&gt;endif&lt;/span&gt;&lt;span class=&quot;token&quot;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;token&quot;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;token&quot;&gt;            &lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #d73a49;&quot;&gt;@&lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #d73a49;&quot;&gt;if&lt;/span&gt;&lt;span class=&quot;token&quot;&gt; &lt;/span&gt;&lt;span class=&quot;token&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #24292e;&quot;&gt;$&lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #24292e;&quot;&gt;hasDate&lt;/span&gt;&lt;span class=&quot;token&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token&quot;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;token&quot;&gt;                &lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #d73a49;&quot;&gt;&amp;lt;&lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #005cc5;&quot;&gt;x&lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #d73a49;&quot;&gt;-&lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #005cc5;&quot;&gt;filament&lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #d73a49;&quot;&gt;-&lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #005cc5;&quot;&gt;notifications&lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #d73a49;&quot;&gt;::&lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #005cc5;&quot;&gt;date&lt;/span&gt;&lt;span class=&quot;token&quot;&gt; &lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #d73a49;&quot;&gt;@&lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #d73a49;&quot;&gt;class&lt;/span&gt;&lt;span class=&quot;token&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #032f62;&quot;&gt;&amp;#039;&lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #032f62;&quot;&gt;mt-1&lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #032f62;&quot;&gt;&amp;#039;&lt;/span&gt;&lt;span class=&quot;token&quot;&gt; &lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #d73a49;&quot;&gt;=&amp;gt;&lt;/span&gt;&lt;span class=&quot;token&quot;&gt; &lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #24292e;&quot;&gt;$&lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #24292e;&quot;&gt;hasTitle&lt;/span&gt;&lt;span class=&quot;token&quot;&gt;]&lt;/span&gt;&lt;span class=&quot;token&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #d73a49;&quot;&gt;&amp;gt;&lt;/span&gt;&lt;span class=&quot;token&quot;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;token&quot;&gt;                    &lt;/span&gt;&lt;span class=&quot;token&quot;&gt;{&lt;/span&gt;&lt;span class=&quot;token&quot;&gt;{&lt;/span&gt;&lt;span class=&quot;token&quot;&gt; &lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #24292e;&quot;&gt;$&lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #24292e;&quot;&gt;date&lt;/span&gt;&lt;span class=&quot;token&quot;&gt; &lt;/span&gt;&lt;span class=&quot;token&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;token&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;token&quot;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;token&quot;&gt;                &lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #d73a49;&quot;&gt;&amp;lt;&lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #d73a49;&quot;&gt;/&lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #005cc5;&quot;&gt;x&lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #d73a49;&quot;&gt;-&lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #005cc5;&quot;&gt;filament&lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #d73a49;&quot;&gt;-&lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #005cc5;&quot;&gt;notifications&lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #d73a49;&quot;&gt;::&lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #005cc5;&quot;&gt;date&lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #d73a49;&quot;&gt;&amp;gt;&lt;/span&gt;&lt;span class=&quot;token&quot;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;token&quot;&gt;            &lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #d73a49;&quot;&gt;@&lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #d73a49;&quot;&gt;endif&lt;/span&gt;&lt;span class=&quot;token&quot;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;token&quot; style=&quot;color: #d73a49;&quot;&gt;@&lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #d73a49;&quot;&gt;if&lt;/span&gt;&lt;span class=&quot;token&quot;&gt; &lt;/span&gt;&lt;span class=&quot;token&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #24292e;&quot;&gt;$&lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #24292e;&quot;&gt;hasBody&lt;/span&gt;&lt;span class=&quot;token&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token&quot;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;token&quot;&gt;    &lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #d73a49;&quot;&gt;&amp;lt;&lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #005cc5;&quot;&gt;x&lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #d73a49;&quot;&gt;-&lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #005cc5;&quot;&gt;filament&lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #d73a49;&quot;&gt;-&lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #005cc5;&quot;&gt;notifications&lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #d73a49;&quot;&gt;::&lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #005cc5;&quot;&gt;body&lt;/span&gt;&lt;span class=&quot;token&quot;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;token&quot;&gt;        &lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #d73a49;&quot;&gt;@&lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #d73a49;&quot;&gt;class&lt;/span&gt;&lt;span class=&quot;token&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #032f62;&quot;&gt;&amp;#039;&lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #032f62;&quot;&gt;mt-1&lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #032f62;&quot;&gt;&amp;#039;&lt;/span&gt;&lt;span class=&quot;token&quot;&gt; &lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #d73a49;&quot;&gt;=&amp;gt;&lt;/span&gt;&lt;span class=&quot;token&quot;&gt; &lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #24292e;&quot;&gt;$&lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #24292e;&quot;&gt;hasTitle&lt;/span&gt;&lt;span class=&quot;token&quot;&gt; &lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #d73a49;&quot;&gt;||&lt;/span&gt;&lt;span class=&quot;token&quot;&gt; &lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #24292e;&quot;&gt;$&lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #24292e;&quot;&gt;hasDate&lt;/span&gt;&lt;span class=&quot;token&quot;&gt;]&lt;/span&gt;&lt;span class=&quot;token&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token&quot;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;token&quot;&gt;    &lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #d73a49;&quot;&gt;&amp;gt;&lt;/span&gt;&lt;span class=&quot;token&quot;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;token&quot;&gt;            &lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #d73a49;&quot;&gt;&amp;lt;&lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #005cc5;&quot;&gt;div&lt;/span&gt;&lt;span class=&quot;token&quot;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;token&quot;&gt;                &lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #005cc5;&quot;&gt;x&lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #d73a49;&quot;&gt;-&lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #005cc5;&quot;&gt;data&lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #d73a49;&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #032f62;&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #032f62;&quot;&gt;{body: @js(str(&lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #032f62;&quot;&gt;$&lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #24292e;&quot;&gt;body&lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #032f62;&quot;&gt;)-&amp;gt;sanitizeHtml()-&amp;gt;toString() )}&lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #032f62;&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span class=&quot;token&quot;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;token&quot;&gt;                &lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #005cc5;&quot;&gt;x&lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #d73a49;&quot;&gt;-&lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #005cc5;&quot;&gt;html&lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #d73a49;&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #032f62;&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #032f62;&quot;&gt;body&lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #032f62;&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span class=&quot;token&quot;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;token&quot;&gt;                &lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #005cc5;&quot;&gt;x&lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #d73a49;&quot;&gt;-&lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #005cc5;&quot;&gt;init&lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #d73a49;&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #032f62;&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #032f62;&quot;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;token&quot; style=&quot;color: #032f62;&quot;&gt;                Echo.private(&amp;#039;App.Models.User.{{ auth()-&amp;gt;user()-&amp;gt;id }}&amp;#039;).listen(&amp;#039;.UpdateNotificationBody&amp;#039;, (event) =&amp;gt; { if (event.id == &amp;#039;{&lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #032f62;&quot;&gt;{&lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #24292e;&quot;&gt;$&lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #24292e;&quot;&gt;notification&lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #d73a49;&quot;&gt;-&amp;gt;&lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #6f42c1;&quot;&gt;getId&lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #032f62;&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #032f62;&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #032f62;&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #032f62;&quot;&gt;}&amp;#039;) body = event.body });
&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;token&quot; style=&quot;color: #032f62;&quot;&gt;                Echo.private(&amp;#039;App.Models.User.{{ auth()-&amp;gt;user()-&amp;gt;id }}&amp;#039;).listen(&amp;#039;.CloseNotification&amp;#039;, (event) =&amp;gt; { if (event.id == &amp;#039;{&lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #032f62;&quot;&gt;{&lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #24292e;&quot;&gt;$&lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #24292e;&quot;&gt;notification&lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #d73a49;&quot;&gt;-&amp;gt;&lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #6f42c1;&quot;&gt;getId&lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #032f62;&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #032f62;&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #032f62;&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #032f62;&quot;&gt;}&amp;#039;) setTimeout(() =&amp;gt; &lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #032f62;&quot;&gt;$&lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #24292e;&quot;&gt;dispatch&lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #032f62;&quot;&gt;(&amp;#039;close-notification&amp;#039;, {id: event.id}), 2000); });
&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;token&quot; style=&quot;color: #032f62;&quot;&gt;                &lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #032f62;&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span class=&quot;token&quot;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;token&quot;&gt;            &lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #d73a49;&quot;&gt;&amp;gt;&lt;/span&gt;&lt;span class=&quot;token&quot;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;token&quot;&gt;                &lt;/span&gt;&lt;span class=&quot;token&quot;&gt;{&lt;/span&gt;&lt;span class=&quot;token&quot;&gt;{&lt;/span&gt;&lt;span class=&quot;token&quot;&gt; &lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #6f42c1;&quot;&gt;str&lt;/span&gt;&lt;span class=&quot;token&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #24292e;&quot;&gt;$&lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #24292e;&quot;&gt;body&lt;/span&gt;&lt;span class=&quot;token&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #d73a49;&quot;&gt;-&amp;gt;&lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #6f42c1;&quot;&gt;sanitizeHtml&lt;/span&gt;&lt;span class=&quot;token&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #d73a49;&quot;&gt;-&amp;gt;&lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #6f42c1;&quot;&gt;toHtmlString&lt;/span&gt;&lt;span class=&quot;token&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token&quot;&gt; &lt;/span&gt;&lt;span class=&quot;token&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;token&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;token&quot;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;token&quot;&gt;            &lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #d73a49;&quot;&gt;&amp;lt;&lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #d73a49;&quot;&gt;/&lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #005cc5;&quot;&gt;div&lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #d73a49;&quot;&gt;&amp;gt;&lt;/span&gt;&lt;span class=&quot;token&quot;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;token&quot;&gt;    &lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #d73a49;&quot;&gt;&amp;lt;&lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #d73a49;&quot;&gt;/&lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #005cc5;&quot;&gt;x&lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #d73a49;&quot;&gt;-&lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #005cc5;&quot;&gt;filament&lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #d73a49;&quot;&gt;-&lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #005cc5;&quot;&gt;notifications&lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #d73a49;&quot;&gt;::&lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #005cc5;&quot;&gt;body&lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #d73a49;&quot;&gt;&amp;gt;&lt;/span&gt;&lt;span class=&quot;token&quot;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;token&quot; style=&quot;color: #d73a49;&quot;&gt;@&lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #d73a49;&quot;&gt;endif&lt;/span&gt;&lt;span class=&quot;token&quot;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;token&quot;&gt;            &lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #d73a49;&quot;&gt;@&lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #d73a49;&quot;&gt;if&lt;/span&gt;&lt;span class=&quot;token&quot;&gt; &lt;/span&gt;&lt;span class=&quot;token&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #24292e;&quot;&gt;$&lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #24292e;&quot;&gt;actions&lt;/span&gt;&lt;span class=&quot;token&quot;&gt; &lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #d73a49;&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;token&quot;&gt; &lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #24292e;&quot;&gt;$&lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #24292e;&quot;&gt;getActions&lt;/span&gt;&lt;span class=&quot;token&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token&quot;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;token&quot;&gt;                &lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #d73a49;&quot;&gt;&amp;lt;&lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #005cc5;&quot;&gt;x&lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #d73a49;&quot;&gt;-&lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #005cc5;&quot;&gt;filament&lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #d73a49;&quot;&gt;-&lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #005cc5;&quot;&gt;notifications&lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #d73a49;&quot;&gt;::&lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #005cc5;&quot;&gt;actions&lt;/span&gt;&lt;span class=&quot;token&quot;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;token&quot;&gt;                    &lt;/span&gt;&lt;span class=&quot;token&quot;&gt;:&lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #005cc5;&quot;&gt;actions&lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #d73a49;&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #032f62;&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #032f62;&quot;&gt;$&lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #24292e;&quot;&gt;actions&lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #032f62;&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span class=&quot;token&quot;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;token&quot;&gt;                    &lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #d73a49;&quot;&gt;@&lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #d73a49;&quot;&gt;class&lt;/span&gt;&lt;span class=&quot;token&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #032f62;&quot;&gt;&amp;#039;&lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #032f62;&quot;&gt;mt-3&lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #032f62;&quot;&gt;&amp;#039;&lt;/span&gt;&lt;span class=&quot;token&quot;&gt; &lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #d73a49;&quot;&gt;=&amp;gt;&lt;/span&gt;&lt;span class=&quot;token&quot;&gt; &lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #24292e;&quot;&gt;$&lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #24292e;&quot;&gt;hasTitle&lt;/span&gt;&lt;span class=&quot;token&quot;&gt; &lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #d73a49;&quot;&gt;||&lt;/span&gt;&lt;span class=&quot;token&quot;&gt; &lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #24292e;&quot;&gt;$&lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #24292e;&quot;&gt;hasDate&lt;/span&gt;&lt;span class=&quot;token&quot;&gt; &lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #d73a49;&quot;&gt;||&lt;/span&gt;&lt;span class=&quot;token&quot;&gt; &lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #24292e;&quot;&gt;$&lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #24292e;&quot;&gt;hasBody&lt;/span&gt;&lt;span class=&quot;token&quot;&gt;]&lt;/span&gt;&lt;span class=&quot;token&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token&quot;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;token&quot;&gt;                &lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #d73a49;&quot;&gt;/&lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #d73a49;&quot;&gt;&amp;gt;&lt;/span&gt;&lt;span class=&quot;token&quot;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;token&quot;&gt;            &lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #d73a49;&quot;&gt;@&lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #d73a49;&quot;&gt;endif&lt;/span&gt;&lt;span class=&quot;token&quot;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;token&quot;&gt;        &lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #d73a49;&quot;&gt;&amp;lt;&lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #d73a49;&quot;&gt;/&lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #005cc5;&quot;&gt;div&lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #d73a49;&quot;&gt;&amp;gt;&lt;/span&gt;&lt;span class=&quot;token&quot;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;token&quot;&gt;                      
&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;token&quot;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;token&quot;&gt;        &lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #d73a49;&quot;&gt;&amp;lt;&lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #005cc5;&quot;&gt;x&lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #d73a49;&quot;&gt;-&lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #005cc5;&quot;&gt;filament&lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #d73a49;&quot;&gt;-&lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #005cc5;&quot;&gt;notifications&lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #d73a49;&quot;&gt;::&lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #005cc5;&quot;&gt;close&lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #d73a49;&quot;&gt;-&lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #005cc5;&quot;&gt;button&lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #d73a49;&quot;&gt;/&lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #d73a49;&quot;&gt;&amp;gt;&lt;/span&gt;&lt;span class=&quot;token&quot;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;token&quot;&gt;    &lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #d73a49;&quot;&gt;&amp;lt;&lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #d73a49;&quot;&gt;/&lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #005cc5;&quot;&gt;div&lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #d73a49;&quot;&gt;&amp;gt;&lt;/span&gt;&lt;span class=&quot;token&quot;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;token&quot; style=&quot;color: #d73a49;&quot;&gt;&amp;lt;&lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #d73a49;&quot;&gt;/&lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #005cc5;&quot;&gt;x&lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #d73a49;&quot;&gt;-&lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #005cc5;&quot;&gt;filament&lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #d73a49;&quot;&gt;-&lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #005cc5;&quot;&gt;notifications&lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #d73a49;&quot;&gt;::&lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #005cc5;&quot;&gt;notification&lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #d73a49;&quot;&gt;&amp;gt;&lt;/span&gt;&lt;span class=&quot;token&quot;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;Here we basically added an alpine component that listent to two events:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;UpdateNotificationBody&lt;/code&gt; for updating a notification&lt;/li&gt;
&lt;li&gt;&lt;code&gt;CloseNotification&lt;/code&gt; for closing the notification when progress == 100%&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;&lt;a id=&quot;content-create-a-new-helper-class-&quot; href=&quot;#content-create-a-new-helper-class-&quot; class=&quot;heading-permalink&quot; aria-hidden=&quot;true&quot; tabindex=&quot;-1&quot; title=&quot;Permalink&quot;&gt;#&lt;/a&gt;Create a new helper class 🎨&lt;/h3&gt;
&lt;p&gt;Put it wherever you want. If you read the code, it's self-explanatory.&lt;/p&gt;
&lt;p&gt;I made the API simple enough so my users will experience the same notification throughout the project, but you can expand it if necessary. The end success notification is a bit more customizable.&lt;/p&gt;
&lt;div x-data=&quot;codeBlock&quot; class=&quot;code-block relative&quot;&gt;&lt;div class=&quot;flex space-x-2 items-center absolute top-0 right-0&quot;&gt;
    &lt;div x-cloak x-show=&quot;showMessage&quot; x-transition class=&quot;py-2 animate-bounce transition duration-300 mt-1 text-sky-500 text-xs&quot;&gt;Copied!&lt;/div&gt;
    &lt;button
        type=&quot;button&quot;
        title=&quot;Copy to clipboard&quot;
        class=&quot;hidden sm:block p-2 pl-3 transition duration-300&quot;
        @click.prevent=&quot;copyToClipboard&quot;
        :class=&quot;{
            'text-black/30 hover:text-black/80': !showMessage,
            'text-sky-500 hover:text-sky-700': showMessage,
        }&quot;&gt;
        &lt;svg xmlns=&quot;http://www.w3.org/2000/svg&quot; fill=&quot;none&quot; viewBox=&quot;0 0 24 24&quot; stroke-width=&quot;1.5&quot; stroke=&quot;currentColor&quot; class=&quot;block w-6 h-6&quot;&gt;
            &lt;path fill=&quot;white&quot; stroke-linecap=&quot;round&quot; stroke-linejoin=&quot;round&quot; d=&quot;M11.35 3.836c-.065.21-.1.433-.1.664 0 .414.336.75.75.75h4.5a.75.75 0 00.75-.75 2.25 2.25 0 00-.1-.664m-5.8 0A2.251 2.251 0 0113.5 2.25H15c1.012 0 1.867.668 2.15 1.586m-5.8 0c-.376.023-.75.05-1.124.08C9.095 4.01 8.25 4.973 8.25 6.108V8.25m8.9-4.414c.376.023.75.05 1.124.08 1.131.094 1.976 1.057 1.976 2.192V16.5A2.25 2.25 0 0118 18.75h-2.25m-7.5-10.5H4.875c-.621 0-1.125.504-1.125 1.125v11.25c0 .621.504 1.125 1.125 1.125h9.75c.621 0 1.125-.504 1.125-1.125V18.75m-7.5-10.5h6.375c.621 0 1.125.504 1.125 1.125v9.375m-8.25-3l1.5 1.5 3-3.75&quot; /&gt;
        &lt;/svg&gt;
    &lt;/button&gt;
&lt;/div&gt;&lt;pre class=&quot;phiki language-php github-light&quot; data-language=&quot;php&quot; style=&quot;background-color: #fff;color: #24292e;&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;token&quot; style=&quot;color: #d73a49;&quot;&gt;&amp;lt;&lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #d73a49;&quot;&gt;?&lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #005cc5;&quot;&gt;php&lt;/span&gt;&lt;span class=&quot;token&quot;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;token&quot;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;token&quot; style=&quot;color: #d73a49;&quot;&gt;namespace&lt;/span&gt;&lt;span class=&quot;token&quot;&gt; &lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #6f42c1;&quot;&gt;App&lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #6f42c1;&quot;&gt;\&lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #6f42c1;&quot;&gt;Services&lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #6f42c1;&quot;&gt;\&lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #6f42c1;&quot;&gt;BackgroundTasks&lt;/span&gt;&lt;span class=&quot;token&quot;&gt;;&lt;/span&gt;&lt;span class=&quot;token&quot;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;token&quot;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;token&quot; style=&quot;color: #d73a49;&quot;&gt;use&lt;/span&gt;&lt;span class=&quot;token&quot;&gt; &lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #005cc5;&quot;&gt;App&lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #005cc5;&quot;&gt;\&lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #005cc5;&quot;&gt;Models&lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #005cc5;&quot;&gt;\&lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #005cc5;&quot;&gt;User&lt;/span&gt;&lt;span class=&quot;token&quot;&gt;;&lt;/span&gt;&lt;span class=&quot;token&quot;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;token&quot; style=&quot;color: #d73a49;&quot;&gt;use&lt;/span&gt;&lt;span class=&quot;token&quot;&gt; &lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #005cc5;&quot;&gt;Closure&lt;/span&gt;&lt;span class=&quot;token&quot;&gt;;&lt;/span&gt;&lt;span class=&quot;token&quot;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;token&quot; style=&quot;color: #d73a49;&quot;&gt;use&lt;/span&gt;&lt;span class=&quot;token&quot;&gt; &lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #005cc5;&quot;&gt;Exception&lt;/span&gt;&lt;span class=&quot;token&quot;&gt;;&lt;/span&gt;&lt;span class=&quot;token&quot;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;token&quot; style=&quot;color: #d73a49;&quot;&gt;use&lt;/span&gt;&lt;span class=&quot;token&quot;&gt; &lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #005cc5;&quot;&gt;Filament&lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #005cc5;&quot;&gt;\&lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #005cc5;&quot;&gt;Notifications&lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #005cc5;&quot;&gt;\&lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #005cc5;&quot;&gt;Notification&lt;/span&gt;&lt;span class=&quot;token&quot;&gt;;&lt;/span&gt;&lt;span class=&quot;token&quot;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;token&quot; style=&quot;color: #d73a49;&quot;&gt;use&lt;/span&gt;&lt;span class=&quot;token&quot;&gt; &lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #005cc5;&quot;&gt;Illuminate&lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #005cc5;&quot;&gt;\&lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #005cc5;&quot;&gt;Bus&lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #005cc5;&quot;&gt;\&lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #005cc5;&quot;&gt;Batch&lt;/span&gt;&lt;span class=&quot;token&quot;&gt;;&lt;/span&gt;&lt;span class=&quot;token&quot;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;token&quot; style=&quot;color: #d73a49;&quot;&gt;use&lt;/span&gt;&lt;span class=&quot;token&quot;&gt; &lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #005cc5;&quot;&gt;Illuminate&lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #005cc5;&quot;&gt;\&lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #005cc5;&quot;&gt;Bus&lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #005cc5;&quot;&gt;\&lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #005cc5;&quot;&gt;PendingBatch&lt;/span&gt;&lt;span class=&quot;token&quot;&gt;;&lt;/span&gt;&lt;span class=&quot;token&quot;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;token&quot; style=&quot;color: #d73a49;&quot;&gt;use&lt;/span&gt;&lt;span class=&quot;token&quot;&gt; &lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #005cc5;&quot;&gt;Illuminate&lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #005cc5;&quot;&gt;\&lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #005cc5;&quot;&gt;Contracts&lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #005cc5;&quot;&gt;\&lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #005cc5;&quot;&gt;Support&lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #005cc5;&quot;&gt;\&lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #005cc5;&quot;&gt;Htmlable&lt;/span&gt;&lt;span class=&quot;token&quot;&gt;;&lt;/span&gt;&lt;span class=&quot;token&quot;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;token&quot; style=&quot;color: #d73a49;&quot;&gt;use&lt;/span&gt;&lt;span class=&quot;token&quot;&gt; &lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #005cc5;&quot;&gt;Illuminate&lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #005cc5;&quot;&gt;\&lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #005cc5;&quot;&gt;Support&lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #005cc5;&quot;&gt;\&lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #005cc5;&quot;&gt;Collection&lt;/span&gt;&lt;span class=&quot;token&quot;&gt;;&lt;/span&gt;&lt;span class=&quot;token&quot;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;token&quot; style=&quot;color: #d73a49;&quot;&gt;use&lt;/span&gt;&lt;span class=&quot;token&quot;&gt; &lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #005cc5;&quot;&gt;Illuminate&lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #005cc5;&quot;&gt;\&lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #005cc5;&quot;&gt;Support&lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #005cc5;&quot;&gt;\&lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #005cc5;&quot;&gt;Facades&lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #005cc5;&quot;&gt;\&lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #005cc5;&quot;&gt;Broadcast&lt;/span&gt;&lt;span class=&quot;token&quot;&gt;;&lt;/span&gt;&lt;span class=&quot;token&quot;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;token&quot; style=&quot;color: #d73a49;&quot;&gt;use&lt;/span&gt;&lt;span class=&quot;token&quot;&gt; &lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #005cc5;&quot;&gt;Illuminate&lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #005cc5;&quot;&gt;\&lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #005cc5;&quot;&gt;Support&lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #005cc5;&quot;&gt;\&lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #005cc5;&quot;&gt;Facades&lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #005cc5;&quot;&gt;\&lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #005cc5;&quot;&gt;Bus&lt;/span&gt;&lt;span class=&quot;token&quot;&gt;;&lt;/span&gt;&lt;span class=&quot;token&quot;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;token&quot;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;token&quot; style=&quot;color: #d73a49;&quot;&gt;class&lt;/span&gt;&lt;span class=&quot;token&quot;&gt; &lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #6f42c1;&quot;&gt;BackgroundTasks&lt;/span&gt;&lt;span class=&quot;token&quot;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;token&quot;&gt;{&lt;/span&gt;&lt;span class=&quot;token&quot;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;token&quot;&gt;    &lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #d73a49;&quot;&gt;protected&lt;/span&gt;&lt;span class=&quot;token&quot;&gt; &lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #005cc5;&quot;&gt;Notification&lt;/span&gt;&lt;span class=&quot;token&quot;&gt; &lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #24292e;&quot;&gt;$&lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #24292e;&quot;&gt;notification&lt;/span&gt;&lt;span class=&quot;token&quot;&gt;;&lt;/span&gt;&lt;span class=&quot;token&quot;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;token&quot;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;token&quot;&gt;    &lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #d73a49;&quot;&gt;protected&lt;/span&gt;&lt;span class=&quot;token&quot;&gt; &lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #005cc5;&quot;&gt;PendingBatch&lt;/span&gt;&lt;span class=&quot;token&quot;&gt;|&lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #005cc5;&quot;&gt;Batch&lt;/span&gt;&lt;span class=&quot;token&quot;&gt; &lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #24292e;&quot;&gt;$&lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #24292e;&quot;&gt;batch&lt;/span&gt;&lt;span class=&quot;token&quot;&gt;;&lt;/span&gt;&lt;span class=&quot;token&quot;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;token&quot;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;token&quot;&gt;    &lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #d73a49;&quot;&gt;protected&lt;/span&gt;&lt;span class=&quot;token&quot;&gt; &lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #005cc5;&quot;&gt;User&lt;/span&gt;&lt;span class=&quot;token&quot;&gt; &lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #24292e;&quot;&gt;$&lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #24292e;&quot;&gt;user&lt;/span&gt;&lt;span class=&quot;token&quot;&gt;;&lt;/span&gt;&lt;span class=&quot;token&quot;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;token&quot;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;token&quot;&gt;    &lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #d73a49;&quot;&gt;protected&lt;/span&gt;&lt;span class=&quot;token&quot;&gt; &lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #005cc5;&quot;&gt;Notification&lt;/span&gt;&lt;span class=&quot;token&quot;&gt; &lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #24292e;&quot;&gt;$&lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #24292e;&quot;&gt;successNotification&lt;/span&gt;&lt;span class=&quot;token&quot;&gt;;&lt;/span&gt;&lt;span class=&quot;token&quot;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;token&quot;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;token&quot;&gt;    &lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #d73a49;&quot;&gt;protected&lt;/span&gt;&lt;span class=&quot;token&quot;&gt; &lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #d73a49;&quot;&gt;array&lt;/span&gt;&lt;span class=&quot;token&quot;&gt;|&lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #005cc5;&quot;&gt;Collection&lt;/span&gt;&lt;span class=&quot;token&quot;&gt; &lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #24292e;&quot;&gt;$&lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #24292e;&quot;&gt;jobs&lt;/span&gt;&lt;span class=&quot;token&quot;&gt;;&lt;/span&gt;&lt;span class=&quot;token&quot;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;token&quot;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;token&quot;&gt;    &lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #d73a49;&quot;&gt;public&lt;/span&gt;&lt;span class=&quot;token&quot;&gt; &lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #d73a49;&quot;&gt;function&lt;/span&gt;&lt;span class=&quot;token&quot;&gt; &lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #005cc5;&quot;&gt;__construct&lt;/span&gt;&lt;span class=&quot;token&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #d73a49;&quot;&gt;array&lt;/span&gt;&lt;span class=&quot;token&quot;&gt;|&lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #005cc5;&quot;&gt;Collection&lt;/span&gt;&lt;span class=&quot;token&quot;&gt; &lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #24292e;&quot;&gt;$&lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #24292e;&quot;&gt;jobs&lt;/span&gt;&lt;span class=&quot;token&quot;&gt;,&lt;/span&gt;&lt;span class=&quot;token&quot;&gt; &lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #005cc5;&quot;&gt;User&lt;/span&gt;&lt;span class=&quot;token&quot;&gt; &lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #24292e;&quot;&gt;$&lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #24292e;&quot;&gt;user&lt;/span&gt;&lt;span class=&quot;token&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token&quot;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;token&quot;&gt;    &lt;/span&gt;&lt;span class=&quot;token&quot;&gt;{&lt;/span&gt;&lt;span class=&quot;token&quot;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;token&quot;&gt;        &lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #005cc5;&quot;&gt;$&lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #005cc5;&quot;&gt;this&lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #d73a49;&quot;&gt;-&amp;gt;&lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #24292e;&quot;&gt;jobs&lt;/span&gt;&lt;span class=&quot;token&quot;&gt; &lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #d73a49;&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;token&quot;&gt; &lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #24292e;&quot;&gt;$&lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #24292e;&quot;&gt;jobs&lt;/span&gt;&lt;span class=&quot;token&quot;&gt;;&lt;/span&gt;&lt;span class=&quot;token&quot;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;token&quot;&gt;        &lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #005cc5;&quot;&gt;$&lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #005cc5;&quot;&gt;this&lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #d73a49;&quot;&gt;-&amp;gt;&lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #24292e;&quot;&gt;user&lt;/span&gt;&lt;span class=&quot;token&quot;&gt; &lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #d73a49;&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;token&quot;&gt; &lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #24292e;&quot;&gt;$&lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #24292e;&quot;&gt;user&lt;/span&gt;&lt;span class=&quot;token&quot;&gt;;&lt;/span&gt;&lt;span class=&quot;token&quot;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;token&quot;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;token&quot;&gt;        &lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #005cc5;&quot;&gt;$&lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #005cc5;&quot;&gt;this&lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #d73a49;&quot;&gt;-&amp;gt;&lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #24292e;&quot;&gt;notification&lt;/span&gt;&lt;span class=&quot;token&quot;&gt; &lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #d73a49;&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;token&quot;&gt; &lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #005cc5;&quot;&gt;Notification&lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #d73a49;&quot;&gt;::&lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #6f42c1;&quot;&gt;make&lt;/span&gt;&lt;span class=&quot;token&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token&quot;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;token&quot;&gt;            &lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #d73a49;&quot;&gt;-&amp;gt;&lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #6f42c1;&quot;&gt;body&lt;/span&gt;&lt;span class=&quot;token&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #032f62;&quot;&gt;&amp;#039;&lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #032f62;&quot;&gt;Starting...&lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #032f62;&quot;&gt;&amp;#039;&lt;/span&gt;&lt;span class=&quot;token&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token&quot;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;token&quot;&gt;            &lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #d73a49;&quot;&gt;-&amp;gt;&lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #6f42c1;&quot;&gt;icon&lt;/span&gt;&lt;span class=&quot;token&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #032f62;&quot;&gt;&amp;#039;&lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #032f62;&quot;&gt;heroicon-o-cog-8-tooth&lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #032f62;&quot;&gt;&amp;#039;&lt;/span&gt;&lt;span class=&quot;token&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token&quot;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;token&quot;&gt;            &lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #d73a49;&quot;&gt;-&amp;gt;&lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #6f42c1;&quot;&gt;info&lt;/span&gt;&lt;span class=&quot;token&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token&quot;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;token&quot;&gt;            &lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #d73a49;&quot;&gt;-&amp;gt;&lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #6f42c1;&quot;&gt;persistent&lt;/span&gt;&lt;span class=&quot;token&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token&quot;&gt;;&lt;/span&gt;&lt;span class=&quot;token&quot;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;token&quot;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;token&quot;&gt;        &lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #005cc5;&quot;&gt;$&lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #005cc5;&quot;&gt;this&lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #d73a49;&quot;&gt;-&amp;gt;&lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #24292e;&quot;&gt;successNotification&lt;/span&gt;&lt;span class=&quot;token&quot;&gt; &lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #d73a49;&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;token&quot;&gt; &lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #005cc5;&quot;&gt;Notification&lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #d73a49;&quot;&gt;::&lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #6f42c1;&quot;&gt;make&lt;/span&gt;&lt;span class=&quot;token&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token&quot;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;token&quot;&gt;            &lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #d73a49;&quot;&gt;-&amp;gt;&lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #6f42c1;&quot;&gt;title&lt;/span&gt;&lt;span class=&quot;token&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #032f62;&quot;&gt;&amp;#039;&lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #032f62;&quot;&gt;Task executed successfully&lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #032f62;&quot;&gt;&amp;#039;&lt;/span&gt;&lt;span class=&quot;token&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token&quot;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;token&quot;&gt;            &lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #d73a49;&quot;&gt;-&amp;gt;&lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #6f42c1;&quot;&gt;success&lt;/span&gt;&lt;span class=&quot;token&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token&quot;&gt;;&lt;/span&gt;&lt;span class=&quot;token&quot;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;token&quot;&gt;    &lt;/span&gt;&lt;span class=&quot;token&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;token&quot;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;token&quot;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;token&quot;&gt;    &lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #d73a49;&quot;&gt;public&lt;/span&gt;&lt;span class=&quot;token&quot;&gt; &lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #d73a49;&quot;&gt;static&lt;/span&gt;&lt;span class=&quot;token&quot;&gt; &lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #d73a49;&quot;&gt;function&lt;/span&gt;&lt;span class=&quot;token&quot;&gt; &lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #6f42c1;&quot;&gt;make&lt;/span&gt;&lt;span class=&quot;token&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #d73a49;&quot;&gt;array&lt;/span&gt;&lt;span class=&quot;token&quot;&gt;|&lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #005cc5;&quot;&gt;Collection&lt;/span&gt;&lt;span class=&quot;token&quot;&gt; &lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #24292e;&quot;&gt;$&lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #24292e;&quot;&gt;jobs&lt;/span&gt;&lt;span class=&quot;token&quot;&gt;,&lt;/span&gt;&lt;span class=&quot;token&quot;&gt; &lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #005cc5;&quot;&gt;User&lt;/span&gt;&lt;span class=&quot;token&quot;&gt; &lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #24292e;&quot;&gt;$&lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #24292e;&quot;&gt;user&lt;/span&gt;&lt;span class=&quot;token&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #d73a49;&quot;&gt;:&lt;/span&gt;&lt;span class=&quot;token&quot;&gt; &lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #d73a49;&quot;&gt;self&lt;/span&gt;&lt;span class=&quot;token&quot;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;token&quot;&gt;    &lt;/span&gt;&lt;span class=&quot;token&quot;&gt;{&lt;/span&gt;&lt;span class=&quot;token&quot;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;token&quot;&gt;        &lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #d73a49;&quot;&gt;return&lt;/span&gt;&lt;span class=&quot;token&quot;&gt; &lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #d73a49;&quot;&gt;new&lt;/span&gt;&lt;span class=&quot;token&quot;&gt; &lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #d73a49;&quot;&gt;self&lt;/span&gt;&lt;span class=&quot;token&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #24292e;&quot;&gt;$&lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #24292e;&quot;&gt;jobs&lt;/span&gt;&lt;span class=&quot;token&quot;&gt;,&lt;/span&gt;&lt;span class=&quot;token&quot;&gt; &lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #24292e;&quot;&gt;$&lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #24292e;&quot;&gt;user&lt;/span&gt;&lt;span class=&quot;token&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token&quot;&gt;;&lt;/span&gt;&lt;span class=&quot;token&quot;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;token&quot;&gt;    &lt;/span&gt;&lt;span class=&quot;token&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;token&quot;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;token&quot;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;token&quot;&gt;    &lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #d73a49;&quot;&gt;public&lt;/span&gt;&lt;span class=&quot;token&quot;&gt; &lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #d73a49;&quot;&gt;function&lt;/span&gt;&lt;span class=&quot;token&quot;&gt; &lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #6f42c1;&quot;&gt;setTitle&lt;/span&gt;&lt;span class=&quot;token&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #d73a49;&quot;&gt;string&lt;/span&gt;&lt;span class=&quot;token&quot;&gt;|&lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #005cc5;&quot;&gt;Closure&lt;/span&gt;&lt;span class=&quot;token&quot;&gt;|&lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #d73a49;&quot;&gt;null&lt;/span&gt;&lt;span class=&quot;token&quot;&gt; &lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #24292e;&quot;&gt;$&lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #24292e;&quot;&gt;title&lt;/span&gt;&lt;span class=&quot;token&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #d73a49;&quot;&gt;:&lt;/span&gt;&lt;span class=&quot;token&quot;&gt; &lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #d73a49;&quot;&gt;self&lt;/span&gt;&lt;span class=&quot;token&quot;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;token&quot;&gt;    &lt;/span&gt;&lt;span class=&quot;token&quot;&gt;{&lt;/span&gt;&lt;span class=&quot;token&quot;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;token&quot;&gt;        &lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #005cc5;&quot;&gt;$&lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #005cc5;&quot;&gt;this&lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #d73a49;&quot;&gt;-&amp;gt;&lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #24292e;&quot;&gt;notification&lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #d73a49;&quot;&gt;-&amp;gt;&lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #6f42c1;&quot;&gt;title&lt;/span&gt;&lt;span class=&quot;token&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #24292e;&quot;&gt;$&lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #24292e;&quot;&gt;title&lt;/span&gt;&lt;span class=&quot;token&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token&quot;&gt;;&lt;/span&gt;&lt;span class=&quot;token&quot;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;token&quot;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;token&quot;&gt;        &lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #d73a49;&quot;&gt;return&lt;/span&gt;&lt;span class=&quot;token&quot;&gt; &lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #005cc5;&quot;&gt;$&lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #005cc5;&quot;&gt;this&lt;/span&gt;&lt;span class=&quot;token&quot;&gt;;&lt;/span&gt;&lt;span class=&quot;token&quot;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;token&quot;&gt;    &lt;/span&gt;&lt;span class=&quot;token&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;token&quot;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;token&quot;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;token&quot;&gt;    &lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #d73a49;&quot;&gt;public&lt;/span&gt;&lt;span class=&quot;token&quot;&gt; &lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #d73a49;&quot;&gt;function&lt;/span&gt;&lt;span class=&quot;token&quot;&gt; &lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #6f42c1;&quot;&gt;setIcon&lt;/span&gt;&lt;span class=&quot;token&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #d73a49;&quot;&gt;string&lt;/span&gt;&lt;span class=&quot;token&quot;&gt;|&lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #005cc5;&quot;&gt;Htmlable&lt;/span&gt;&lt;span class=&quot;token&quot;&gt;|&lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #005cc5;&quot;&gt;Closure&lt;/span&gt;&lt;span class=&quot;token&quot;&gt;|&lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #d73a49;&quot;&gt;null&lt;/span&gt;&lt;span class=&quot;token&quot;&gt; &lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #24292e;&quot;&gt;$&lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #24292e;&quot;&gt;icon&lt;/span&gt;&lt;span class=&quot;token&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #d73a49;&quot;&gt;:&lt;/span&gt;&lt;span class=&quot;token&quot;&gt; &lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #d73a49;&quot;&gt;self&lt;/span&gt;&lt;span class=&quot;token&quot;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;token&quot;&gt;    &lt;/span&gt;&lt;span class=&quot;token&quot;&gt;{&lt;/span&gt;&lt;span class=&quot;token&quot;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;token&quot;&gt;        &lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #005cc5;&quot;&gt;$&lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #005cc5;&quot;&gt;this&lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #d73a49;&quot;&gt;-&amp;gt;&lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #24292e;&quot;&gt;notification&lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #d73a49;&quot;&gt;-&amp;gt;&lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #6f42c1;&quot;&gt;icon&lt;/span&gt;&lt;span class=&quot;token&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #24292e;&quot;&gt;$&lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #24292e;&quot;&gt;icon&lt;/span&gt;&lt;span class=&quot;token&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token&quot;&gt;;&lt;/span&gt;&lt;span class=&quot;token&quot;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;token&quot;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;token&quot;&gt;        &lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #d73a49;&quot;&gt;return&lt;/span&gt;&lt;span class=&quot;token&quot;&gt; &lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #005cc5;&quot;&gt;$&lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #005cc5;&quot;&gt;this&lt;/span&gt;&lt;span class=&quot;token&quot;&gt;;&lt;/span&gt;&lt;span class=&quot;token&quot;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;token&quot;&gt;    &lt;/span&gt;&lt;span class=&quot;token&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;token&quot;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;token&quot;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;token&quot;&gt;    &lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #d73a49;&quot;&gt;public&lt;/span&gt;&lt;span class=&quot;token&quot;&gt; &lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #d73a49;&quot;&gt;function&lt;/span&gt;&lt;span class=&quot;token&quot;&gt; &lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #6f42c1;&quot;&gt;dispatch&lt;/span&gt;&lt;span class=&quot;token&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #d73a49;&quot;&gt;:&lt;/span&gt;&lt;span class=&quot;token&quot;&gt; &lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #d73a49;&quot;&gt;self&lt;/span&gt;&lt;span class=&quot;token&quot;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;token&quot;&gt;    &lt;/span&gt;&lt;span class=&quot;token&quot;&gt;{&lt;/span&gt;&lt;span class=&quot;token&quot;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;token&quot;&gt;        &lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #24292e;&quot;&gt;$&lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #24292e;&quot;&gt;notificationId&lt;/span&gt;&lt;span class=&quot;token&quot;&gt; &lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #d73a49;&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;token&quot;&gt; &lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #005cc5;&quot;&gt;$&lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #005cc5;&quot;&gt;this&lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #d73a49;&quot;&gt;-&amp;gt;&lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #24292e;&quot;&gt;notification&lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #d73a49;&quot;&gt;-&amp;gt;&lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #6f42c1;&quot;&gt;getId&lt;/span&gt;&lt;span class=&quot;token&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token&quot;&gt;;&lt;/span&gt;&lt;span class=&quot;token&quot;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;token&quot;&gt;        &lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #24292e;&quot;&gt;$&lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #24292e;&quot;&gt;userId&lt;/span&gt;&lt;span class=&quot;token&quot;&gt; &lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #d73a49;&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;token&quot;&gt; &lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #005cc5;&quot;&gt;$&lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #005cc5;&quot;&gt;this&lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #d73a49;&quot;&gt;-&amp;gt;&lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #24292e;&quot;&gt;user&lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #d73a49;&quot;&gt;-&amp;gt;&lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #24292e;&quot;&gt;id&lt;/span&gt;&lt;span class=&quot;token&quot;&gt;;&lt;/span&gt;&lt;span class=&quot;token&quot;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;token&quot;&gt;        &lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #24292e;&quot;&gt;$&lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #24292e;&quot;&gt;successNotification&lt;/span&gt;&lt;span class=&quot;token&quot;&gt; &lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #d73a49;&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;token&quot;&gt; &lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #005cc5;&quot;&gt;$&lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #005cc5;&quot;&gt;this&lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #d73a49;&quot;&gt;-&amp;gt;&lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #24292e;&quot;&gt;successNotification&lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #d73a49;&quot;&gt;-&amp;gt;&lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #6f42c1;&quot;&gt;toArray&lt;/span&gt;&lt;span class=&quot;token&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token&quot;&gt;;&lt;/span&gt;&lt;span class=&quot;token&quot;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;token&quot;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;token&quot;&gt;        &lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #005cc5;&quot;&gt;$&lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #005cc5;&quot;&gt;this&lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #d73a49;&quot;&gt;-&amp;gt;&lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #24292e;&quot;&gt;batch&lt;/span&gt;&lt;span class=&quot;token&quot;&gt; &lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #d73a49;&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;token&quot;&gt; &lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #005cc5;&quot;&gt;Bus&lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #d73a49;&quot;&gt;::&lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #6f42c1;&quot;&gt;batch&lt;/span&gt;&lt;span class=&quot;token&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #005cc5;&quot;&gt;$&lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #005cc5;&quot;&gt;this&lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #d73a49;&quot;&gt;-&amp;gt;&lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #24292e;&quot;&gt;jobs&lt;/span&gt;&lt;span class=&quot;token&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token&quot;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;token&quot;&gt;            &lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #d73a49;&quot;&gt;-&amp;gt;&lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #6f42c1;&quot;&gt;progress&lt;/span&gt;&lt;span class=&quot;token&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #d73a49;&quot;&gt;function&lt;/span&gt;&lt;span class=&quot;token&quot;&gt; &lt;/span&gt;&lt;span class=&quot;token&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #005cc5;&quot;&gt;Batch&lt;/span&gt;&lt;span class=&quot;token&quot;&gt; &lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #24292e;&quot;&gt;$&lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #24292e;&quot;&gt;batch&lt;/span&gt;&lt;span class=&quot;token&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token&quot;&gt; &lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #d73a49;&quot;&gt;use&lt;/span&gt;&lt;span class=&quot;token&quot;&gt; &lt;/span&gt;&lt;span class=&quot;token&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #24292e;&quot;&gt;$&lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #24292e;&quot;&gt;notificationId&lt;/span&gt;&lt;span class=&quot;token&quot;&gt;,&lt;/span&gt;&lt;span class=&quot;token&quot;&gt; &lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #24292e;&quot;&gt;$&lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #24292e;&quot;&gt;userId&lt;/span&gt;&lt;span class=&quot;token&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token&quot;&gt; &lt;/span&gt;&lt;span class=&quot;token&quot;&gt;{&lt;/span&gt;&lt;span class=&quot;token&quot;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;token&quot;&gt;                &lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #d73a49;&quot;&gt;self&lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #d73a49;&quot;&gt;::&lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #6f42c1;&quot;&gt;updateNotificationProgress&lt;/span&gt;&lt;span class=&quot;token&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #24292e;&quot;&gt;$&lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #24292e;&quot;&gt;batch&lt;/span&gt;&lt;span class=&quot;token&quot;&gt;,&lt;/span&gt;&lt;span class=&quot;token&quot;&gt; &lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #24292e;&quot;&gt;$&lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #24292e;&quot;&gt;notificationId&lt;/span&gt;&lt;span class=&quot;token&quot;&gt;,&lt;/span&gt;&lt;span class=&quot;token&quot;&gt; &lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #24292e;&quot;&gt;$&lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #24292e;&quot;&gt;userId&lt;/span&gt;&lt;span class=&quot;token&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token&quot;&gt;;&lt;/span&gt;&lt;span class=&quot;token&quot;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;token&quot;&gt;            &lt;/span&gt;&lt;span class=&quot;token&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;token&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token&quot;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;token&quot;&gt;            &lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #d73a49;&quot;&gt;-&amp;gt;&lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #6f42c1;&quot;&gt;finally&lt;/span&gt;&lt;span class=&quot;token&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #d73a49;&quot;&gt;function&lt;/span&gt;&lt;span class=&quot;token&quot;&gt; &lt;/span&gt;&lt;span class=&quot;token&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #005cc5;&quot;&gt;Batch&lt;/span&gt;&lt;span class=&quot;token&quot;&gt; &lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #24292e;&quot;&gt;$&lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #24292e;&quot;&gt;batch&lt;/span&gt;&lt;span class=&quot;token&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token&quot;&gt; &lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #d73a49;&quot;&gt;use&lt;/span&gt;&lt;span class=&quot;token&quot;&gt; &lt;/span&gt;&lt;span class=&quot;token&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #24292e;&quot;&gt;$&lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #24292e;&quot;&gt;notificationId&lt;/span&gt;&lt;span class=&quot;token&quot;&gt;,&lt;/span&gt;&lt;span class=&quot;token&quot;&gt; &lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #24292e;&quot;&gt;$&lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #24292e;&quot;&gt;userId&lt;/span&gt;&lt;span class=&quot;token&quot;&gt;,&lt;/span&gt;&lt;span class=&quot;token&quot;&gt; &lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #24292e;&quot;&gt;$&lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #24292e;&quot;&gt;successNotification&lt;/span&gt;&lt;span class=&quot;token&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token&quot;&gt; &lt;/span&gt;&lt;span class=&quot;token&quot;&gt;{&lt;/span&gt;&lt;span class=&quot;token&quot;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;token&quot;&gt;                &lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #d73a49;&quot;&gt;self&lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #d73a49;&quot;&gt;::&lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #6f42c1;&quot;&gt;updateNotificationProgress&lt;/span&gt;&lt;span class=&quot;token&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #24292e;&quot;&gt;$&lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #24292e;&quot;&gt;batch&lt;/span&gt;&lt;span class=&quot;token&quot;&gt;,&lt;/span&gt;&lt;span class=&quot;token&quot;&gt; &lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #24292e;&quot;&gt;$&lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #24292e;&quot;&gt;notificationId&lt;/span&gt;&lt;span class=&quot;token&quot;&gt;,&lt;/span&gt;&lt;span class=&quot;token&quot;&gt; &lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #24292e;&quot;&gt;$&lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #24292e;&quot;&gt;userId&lt;/span&gt;&lt;span class=&quot;token&quot;&gt;,&lt;/span&gt;&lt;span class=&quot;token&quot;&gt; &lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #24292e;&quot;&gt;$&lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #24292e;&quot;&gt;successNotification&lt;/span&gt;&lt;span class=&quot;token&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token&quot;&gt;;&lt;/span&gt;&lt;span class=&quot;token&quot;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;token&quot;&gt;            &lt;/span&gt;&lt;span class=&quot;token&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;token&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token&quot;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;token&quot;&gt;            &lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #d73a49;&quot;&gt;-&amp;gt;&lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #6f42c1;&quot;&gt;dispatch&lt;/span&gt;&lt;span class=&quot;token&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token&quot;&gt;;&lt;/span&gt;&lt;span class=&quot;token&quot;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;token&quot;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;token&quot;&gt;        &lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #005cc5;&quot;&gt;$&lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #005cc5;&quot;&gt;this&lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #d73a49;&quot;&gt;-&amp;gt;&lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #24292e;&quot;&gt;notification&lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #d73a49;&quot;&gt;-&amp;gt;&lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #6f42c1;&quot;&gt;send&lt;/span&gt;&lt;span class=&quot;token&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token&quot;&gt;;&lt;/span&gt;&lt;span class=&quot;token&quot;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;token&quot;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;token&quot;&gt;        &lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #d73a49;&quot;&gt;return&lt;/span&gt;&lt;span class=&quot;token&quot;&gt; &lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #005cc5;&quot;&gt;$&lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #005cc5;&quot;&gt;this&lt;/span&gt;&lt;span class=&quot;token&quot;&gt;;&lt;/span&gt;&lt;span class=&quot;token&quot;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;token&quot;&gt;    &lt;/span&gt;&lt;span class=&quot;token&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;token&quot;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;token&quot;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;token&quot;&gt;    &lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #d73a49;&quot;&gt;public&lt;/span&gt;&lt;span class=&quot;token&quot;&gt; &lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #d73a49;&quot;&gt;function&lt;/span&gt;&lt;span class=&quot;token&quot;&gt; &lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #6f42c1;&quot;&gt;setSuccessNotification&lt;/span&gt;&lt;span class=&quot;token&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #005cc5;&quot;&gt;Closure&lt;/span&gt;&lt;span class=&quot;token&quot;&gt; &lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #24292e;&quot;&gt;$&lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #24292e;&quot;&gt;callable&lt;/span&gt;&lt;span class=&quot;token&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #d73a49;&quot;&gt;:&lt;/span&gt;&lt;span class=&quot;token&quot;&gt; &lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #d73a49;&quot;&gt;self&lt;/span&gt;&lt;span class=&quot;token&quot;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;token&quot;&gt;    &lt;/span&gt;&lt;span class=&quot;token&quot;&gt;{&lt;/span&gt;&lt;span class=&quot;token&quot;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;token&quot;&gt;        &lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #005cc5;&quot;&gt;$&lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #005cc5;&quot;&gt;this&lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #d73a49;&quot;&gt;-&amp;gt;&lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #24292e;&quot;&gt;successNotification&lt;/span&gt;&lt;span class=&quot;token&quot;&gt; &lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #d73a49;&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;token&quot;&gt; &lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #24292e;&quot;&gt;$&lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #24292e;&quot;&gt;callable&lt;/span&gt;&lt;span class=&quot;token&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #005cc5;&quot;&gt;$&lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #005cc5;&quot;&gt;this&lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #d73a49;&quot;&gt;-&amp;gt;&lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #24292e;&quot;&gt;successNotification&lt;/span&gt;&lt;span class=&quot;token&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token&quot;&gt;;&lt;/span&gt;&lt;span class=&quot;token&quot;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;token&quot;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;token&quot;&gt;        &lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #d73a49;&quot;&gt;return&lt;/span&gt;&lt;span class=&quot;token&quot;&gt; &lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #005cc5;&quot;&gt;$&lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #005cc5;&quot;&gt;this&lt;/span&gt;&lt;span class=&quot;token&quot;&gt;;&lt;/span&gt;&lt;span class=&quot;token&quot;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;token&quot;&gt;    &lt;/span&gt;&lt;span class=&quot;token&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;token&quot;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;token&quot;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;token&quot;&gt;    &lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #d73a49;&quot;&gt;public&lt;/span&gt;&lt;span class=&quot;token&quot;&gt; &lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #d73a49;&quot;&gt;function&lt;/span&gt;&lt;span class=&quot;token&quot;&gt; &lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #6f42c1;&quot;&gt;getBatchId&lt;/span&gt;&lt;span class=&quot;token&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #d73a49;&quot;&gt;:&lt;/span&gt;&lt;span class=&quot;token&quot;&gt; &lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #d73a49;&quot;&gt;string&lt;/span&gt;&lt;span class=&quot;token&quot;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;token&quot;&gt;    &lt;/span&gt;&lt;span class=&quot;token&quot;&gt;{&lt;/span&gt;&lt;span class=&quot;token&quot;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;token&quot;&gt;        &lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #d73a49;&quot;&gt;if&lt;/span&gt;&lt;span class=&quot;token&quot;&gt; &lt;/span&gt;&lt;span class=&quot;token&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #005cc5;&quot;&gt;$&lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #005cc5;&quot;&gt;this&lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #d73a49;&quot;&gt;-&amp;gt;&lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #24292e;&quot;&gt;batch&lt;/span&gt;&lt;span class=&quot;token&quot;&gt; &lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #d73a49;&quot;&gt;instanceof&lt;/span&gt;&lt;span class=&quot;token&quot;&gt; &lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #005cc5;&quot;&gt;PendingBatch&lt;/span&gt;&lt;span class=&quot;token&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token&quot;&gt; &lt;/span&gt;&lt;span class=&quot;token&quot;&gt;{&lt;/span&gt;&lt;span class=&quot;token&quot;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;token&quot;&gt;            &lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #d73a49;&quot;&gt;throw&lt;/span&gt;&lt;span class=&quot;token&quot;&gt; &lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #d73a49;&quot;&gt;new&lt;/span&gt;&lt;span class=&quot;token&quot;&gt; &lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #005cc5;&quot;&gt;Exception&lt;/span&gt;&lt;span class=&quot;token&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #032f62;&quot;&gt;&amp;#039;&lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #032f62;&quot;&gt;Batch has not been dispatched yet&lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #032f62;&quot;&gt;&amp;#039;&lt;/span&gt;&lt;span class=&quot;token&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token&quot;&gt;;&lt;/span&gt;&lt;span class=&quot;token&quot;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;token&quot;&gt;        &lt;/span&gt;&lt;span class=&quot;token&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;token&quot;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;token&quot;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;token&quot;&gt;        &lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #d73a49;&quot;&gt;return&lt;/span&gt;&lt;span class=&quot;token&quot;&gt; &lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #005cc5;&quot;&gt;$&lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #005cc5;&quot;&gt;this&lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #d73a49;&quot;&gt;-&amp;gt;&lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #24292e;&quot;&gt;batch&lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #d73a49;&quot;&gt;-&amp;gt;&lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #24292e;&quot;&gt;id&lt;/span&gt;&lt;span class=&quot;token&quot;&gt;;&lt;/span&gt;&lt;span class=&quot;token&quot;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;token&quot;&gt;    &lt;/span&gt;&lt;span class=&quot;token&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;token&quot;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;token&quot;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;token&quot;&gt;    &lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #d73a49;&quot;&gt;public&lt;/span&gt;&lt;span class=&quot;token&quot;&gt; &lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #d73a49;&quot;&gt;function&lt;/span&gt;&lt;span class=&quot;token&quot;&gt; &lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #6f42c1;&quot;&gt;getNotificationId&lt;/span&gt;&lt;span class=&quot;token&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #d73a49;&quot;&gt;:&lt;/span&gt;&lt;span class=&quot;token&quot;&gt; &lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #d73a49;&quot;&gt;string&lt;/span&gt;&lt;span class=&quot;token&quot;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;token&quot;&gt;    &lt;/span&gt;&lt;span class=&quot;token&quot;&gt;{&lt;/span&gt;&lt;span class=&quot;token&quot;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;token&quot;&gt;        &lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #d73a49;&quot;&gt;return&lt;/span&gt;&lt;span class=&quot;token&quot;&gt; &lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #005cc5;&quot;&gt;$&lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #005cc5;&quot;&gt;this&lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #d73a49;&quot;&gt;-&amp;gt;&lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #24292e;&quot;&gt;notification&lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #d73a49;&quot;&gt;-&amp;gt;&lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #6f42c1;&quot;&gt;getId&lt;/span&gt;&lt;span class=&quot;token&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token&quot;&gt;;&lt;/span&gt;&lt;span class=&quot;token&quot;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;token&quot;&gt;    &lt;/span&gt;&lt;span class=&quot;token&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;token&quot;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;token&quot;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;token&quot;&gt;    &lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #d73a49;&quot;&gt;public&lt;/span&gt;&lt;span class=&quot;token&quot;&gt; &lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #d73a49;&quot;&gt;static&lt;/span&gt;&lt;span class=&quot;token&quot;&gt; &lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #d73a49;&quot;&gt;function&lt;/span&gt;&lt;span class=&quot;token&quot;&gt; &lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #6f42c1;&quot;&gt;updateNotificationProgress&lt;/span&gt;&lt;span class=&quot;token&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #005cc5;&quot;&gt;Batch&lt;/span&gt;&lt;span class=&quot;token&quot;&gt; &lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #24292e;&quot;&gt;$&lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #24292e;&quot;&gt;batch&lt;/span&gt;&lt;span class=&quot;token&quot;&gt;,&lt;/span&gt;&lt;span class=&quot;token&quot;&gt; &lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #d73a49;&quot;&gt;string&lt;/span&gt;&lt;span class=&quot;token&quot;&gt; &lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #24292e;&quot;&gt;$&lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #24292e;&quot;&gt;notificationId&lt;/span&gt;&lt;span class=&quot;token&quot;&gt;,&lt;/span&gt;&lt;span class=&quot;token&quot;&gt; &lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #d73a49;&quot;&gt;int&lt;/span&gt;&lt;span class=&quot;token&quot;&gt; &lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #24292e;&quot;&gt;$&lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #24292e;&quot;&gt;userId&lt;/span&gt;&lt;span class=&quot;token&quot;&gt;,&lt;/span&gt;&lt;span class=&quot;token&quot;&gt; &lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #d73a49;&quot;&gt;?&lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #d73a49;&quot;&gt;array&lt;/span&gt;&lt;span class=&quot;token&quot;&gt; &lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #24292e;&quot;&gt;$&lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #24292e;&quot;&gt;successNotification&lt;/span&gt;&lt;span class=&quot;token&quot;&gt; &lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #d73a49;&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;token&quot;&gt; &lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #005cc5;&quot;&gt;null&lt;/span&gt;&lt;span class=&quot;token&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #d73a49;&quot;&gt;:&lt;/span&gt;&lt;span class=&quot;token&quot;&gt; &lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #d73a49;&quot;&gt;void&lt;/span&gt;&lt;span class=&quot;token&quot;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;token&quot;&gt;    &lt;/span&gt;&lt;span class=&quot;token&quot;&gt;{&lt;/span&gt;&lt;span class=&quot;token&quot;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;token&quot;&gt;        &lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #24292e;&quot;&gt;$&lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #24292e;&quot;&gt;body&lt;/span&gt;&lt;span class=&quot;token&quot;&gt; &lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #d73a49;&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;token&quot;&gt; &lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #24292e;&quot;&gt;$&lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #24292e;&quot;&gt;batch&lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #d73a49;&quot;&gt;-&amp;gt;&lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #6f42c1;&quot;&gt;progress&lt;/span&gt;&lt;span class=&quot;token&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #d73a49;&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #032f62;&quot;&gt;&amp;#039;&lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #032f62;&quot;&gt;% done&lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #032f62;&quot;&gt;&amp;#039;&lt;/span&gt;&lt;span class=&quot;token&quot;&gt;;&lt;/span&gt;&lt;span class=&quot;token&quot;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;token&quot;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;token&quot;&gt;        &lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #005cc5;&quot;&gt;Broadcast&lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #d73a49;&quot;&gt;::&lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #6f42c1;&quot;&gt;private&lt;/span&gt;&lt;span class=&quot;token&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #032f62;&quot;&gt;&amp;#039;&lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #032f62;&quot;&gt;App.Models.User.&lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #032f62;&quot;&gt;&amp;#039;&lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #d73a49;&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #24292e;&quot;&gt;$&lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #24292e;&quot;&gt;userId&lt;/span&gt;&lt;span class=&quot;token&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token&quot;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;token&quot;&gt;            &lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #d73a49;&quot;&gt;-&amp;gt;&lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #6f42c1;&quot;&gt;as&lt;/span&gt;&lt;span class=&quot;token&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #032f62;&quot;&gt;&amp;#039;&lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #032f62;&quot;&gt;UpdateNotificationBody&lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #032f62;&quot;&gt;&amp;#039;&lt;/span&gt;&lt;span class=&quot;token&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token&quot;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;token&quot;&gt;            &lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #d73a49;&quot;&gt;-&amp;gt;&lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #6f42c1;&quot;&gt;with&lt;/span&gt;&lt;span class=&quot;token&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;token&quot;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;token&quot;&gt;                &lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #032f62;&quot;&gt;&amp;#039;&lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #032f62;&quot;&gt;id&lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #032f62;&quot;&gt;&amp;#039;&lt;/span&gt;&lt;span class=&quot;token&quot;&gt; &lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #d73a49;&quot;&gt;=&amp;gt;&lt;/span&gt;&lt;span class=&quot;token&quot;&gt; &lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #24292e;&quot;&gt;$&lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #24292e;&quot;&gt;notificationId&lt;/span&gt;&lt;span class=&quot;token&quot;&gt;,&lt;/span&gt;&lt;span class=&quot;token&quot;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;token&quot;&gt;                &lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #032f62;&quot;&gt;&amp;#039;&lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #032f62;&quot;&gt;body&lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #032f62;&quot;&gt;&amp;#039;&lt;/span&gt;&lt;span class=&quot;token&quot;&gt; &lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #d73a49;&quot;&gt;=&amp;gt;&lt;/span&gt;&lt;span class=&quot;token&quot;&gt; &lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #24292e;&quot;&gt;$&lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #24292e;&quot;&gt;body&lt;/span&gt;&lt;span class=&quot;token&quot;&gt;,&lt;/span&gt;&lt;span class=&quot;token&quot;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;token&quot;&gt;            &lt;/span&gt;&lt;span class=&quot;token&quot;&gt;]&lt;/span&gt;&lt;span class=&quot;token&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token&quot;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;token&quot;&gt;            &lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #d73a49;&quot;&gt;-&amp;gt;&lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #6f42c1;&quot;&gt;sendNow&lt;/span&gt;&lt;span class=&quot;token&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token&quot;&gt;;&lt;/span&gt;&lt;span class=&quot;token&quot;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;token&quot;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;token&quot;&gt;        &lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #d73a49;&quot;&gt;if&lt;/span&gt;&lt;span class=&quot;token&quot;&gt; &lt;/span&gt;&lt;span class=&quot;token&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #24292e;&quot;&gt;$&lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #24292e;&quot;&gt;batch&lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #d73a49;&quot;&gt;-&amp;gt;&lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #6f42c1;&quot;&gt;finished&lt;/span&gt;&lt;span class=&quot;token&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token&quot;&gt; &lt;/span&gt;&lt;span class=&quot;token&quot;&gt;{&lt;/span&gt;&lt;span class=&quot;token&quot;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;token&quot;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;token&quot;&gt;            &lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #d73a49;&quot;&gt;if&lt;/span&gt;&lt;span class=&quot;token&quot;&gt; &lt;/span&gt;&lt;span class=&quot;token&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #24292e;&quot;&gt;$&lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #24292e;&quot;&gt;successNotification&lt;/span&gt;&lt;span class=&quot;token&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token&quot;&gt; &lt;/span&gt;&lt;span class=&quot;token&quot;&gt;{&lt;/span&gt;&lt;span class=&quot;token&quot;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;token&quot;&gt;                &lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #005cc5;&quot;&gt;Notification&lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #d73a49;&quot;&gt;::&lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #6f42c1;&quot;&gt;fromArray&lt;/span&gt;&lt;span class=&quot;token&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #24292e;&quot;&gt;$&lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #24292e;&quot;&gt;successNotification&lt;/span&gt;&lt;span class=&quot;token&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #d73a49;&quot;&gt;-&amp;gt;&lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #6f42c1;&quot;&gt;broadcast&lt;/span&gt;&lt;span class=&quot;token&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #005cc5;&quot;&gt;User&lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #d73a49;&quot;&gt;::&lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #6f42c1;&quot;&gt;find&lt;/span&gt;&lt;span class=&quot;token&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #24292e;&quot;&gt;$&lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #24292e;&quot;&gt;userId&lt;/span&gt;&lt;span class=&quot;token&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token&quot;&gt;;&lt;/span&gt;&lt;span class=&quot;token&quot;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;token&quot;&gt;            &lt;/span&gt;&lt;span class=&quot;token&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;token&quot;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;token&quot;&gt;            &lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #005cc5;&quot;&gt;Broadcast&lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #d73a49;&quot;&gt;::&lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #6f42c1;&quot;&gt;private&lt;/span&gt;&lt;span class=&quot;token&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #032f62;&quot;&gt;&amp;#039;&lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #032f62;&quot;&gt;App.Models.User.&lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #032f62;&quot;&gt;&amp;#039;&lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #d73a49;&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #24292e;&quot;&gt;$&lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #24292e;&quot;&gt;userId&lt;/span&gt;&lt;span class=&quot;token&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token&quot;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;token&quot;&gt;                &lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #d73a49;&quot;&gt;-&amp;gt;&lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #6f42c1;&quot;&gt;as&lt;/span&gt;&lt;span class=&quot;token&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #032f62;&quot;&gt;&amp;#039;&lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #032f62;&quot;&gt;CloseNotification&lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #032f62;&quot;&gt;&amp;#039;&lt;/span&gt;&lt;span class=&quot;token&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token&quot;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;token&quot;&gt;                &lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #d73a49;&quot;&gt;-&amp;gt;&lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #6f42c1;&quot;&gt;with&lt;/span&gt;&lt;span class=&quot;token&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #032f62;&quot;&gt;&amp;#039;&lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #032f62;&quot;&gt;id&lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #032f62;&quot;&gt;&amp;#039;&lt;/span&gt;&lt;span class=&quot;token&quot;&gt; &lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #d73a49;&quot;&gt;=&amp;gt;&lt;/span&gt;&lt;span class=&quot;token&quot;&gt; &lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #24292e;&quot;&gt;$&lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #24292e;&quot;&gt;notificationId&lt;/span&gt;&lt;span class=&quot;token&quot;&gt;]&lt;/span&gt;&lt;span class=&quot;token&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token&quot;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;token&quot;&gt;                &lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #d73a49;&quot;&gt;-&amp;gt;&lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #6f42c1;&quot;&gt;send&lt;/span&gt;&lt;span class=&quot;token&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token&quot;&gt;;&lt;/span&gt;&lt;span class=&quot;token&quot;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;token&quot;&gt;        &lt;/span&gt;&lt;span class=&quot;token&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;token&quot;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;token&quot;&gt;    &lt;/span&gt;&lt;span class=&quot;token&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;token&quot;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;token&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;token&quot;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;h3&gt;&lt;a id=&quot;content-use-it-on-your-project&quot; href=&quot;#content-use-it-on-your-project&quot; class=&quot;heading-permalink&quot; aria-hidden=&quot;true&quot; tabindex=&quot;-1&quot; title=&quot;Permalink&quot;&gt;#&lt;/a&gt;Use it on your project&lt;/h3&gt;
&lt;p&gt;Now we take our previous code, and use our knewly created &lt;code&gt;BackgroundTasks&lt;/code&gt; helper!&lt;/p&gt;
&lt;div x-data=&quot;codeBlock&quot; class=&quot;code-block relative&quot;&gt;&lt;div class=&quot;flex space-x-2 items-center absolute top-0 right-0&quot;&gt;
    &lt;div x-cloak x-show=&quot;showMessage&quot; x-transition class=&quot;py-2 animate-bounce transition duration-300 mt-1 text-sky-500 text-xs&quot;&gt;Copied!&lt;/div&gt;
    &lt;button
        type=&quot;button&quot;
        title=&quot;Copy to clipboard&quot;
        class=&quot;hidden sm:block p-2 pl-3 transition duration-300&quot;
        @click.prevent=&quot;copyToClipboard&quot;
        :class=&quot;{
            'text-black/30 hover:text-black/80': !showMessage,
            'text-sky-500 hover:text-sky-700': showMessage,
        }&quot;&gt;
        &lt;svg xmlns=&quot;http://www.w3.org/2000/svg&quot; fill=&quot;none&quot; viewBox=&quot;0 0 24 24&quot; stroke-width=&quot;1.5&quot; stroke=&quot;currentColor&quot; class=&quot;block w-6 h-6&quot;&gt;
            &lt;path fill=&quot;white&quot; stroke-linecap=&quot;round&quot; stroke-linejoin=&quot;round&quot; d=&quot;M11.35 3.836c-.065.21-.1.433-.1.664 0 .414.336.75.75.75h4.5a.75.75 0 00.75-.75 2.25 2.25 0 00-.1-.664m-5.8 0A2.251 2.251 0 0113.5 2.25H15c1.012 0 1.867.668 2.15 1.586m-5.8 0c-.376.023-.75.05-1.124.08C9.095 4.01 8.25 4.973 8.25 6.108V8.25m8.9-4.414c.376.023.75.05 1.124.08 1.131.094 1.976 1.057 1.976 2.192V16.5A2.25 2.25 0 0118 18.75h-2.25m-7.5-10.5H4.875c-.621 0-1.125.504-1.125 1.125v11.25c0 .621.504 1.125 1.125 1.125h9.75c.621 0 1.125-.504 1.125-1.125V18.75m-7.5-10.5h6.375c.621 0 1.125.504 1.125 1.125v9.375m-8.25-3l1.5 1.5 3-3.75&quot; /&gt;
        &lt;/svg&gt;
    &lt;/button&gt;
&lt;/div&gt;&lt;pre class=&quot;phiki language-php github-light&quot; data-language=&quot;php&quot; style=&quot;background-color: #fff;color: #24292e;&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;token&quot;&gt;#[&lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #005cc5;&quot;&gt;Renderless&lt;/span&gt;&lt;span class=&quot;token&quot;&gt;]&lt;/span&gt;&lt;span class=&quot;token&quot;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;token&quot; style=&quot;color: #d73a49;&quot;&gt;public&lt;/span&gt;&lt;span class=&quot;token&quot;&gt; &lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #d73a49;&quot;&gt;function&lt;/span&gt;&lt;span class=&quot;token&quot;&gt; &lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #6f42c1;&quot;&gt;checkIssues&lt;/span&gt;&lt;span class=&quot;token&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token&quot;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;token&quot;&gt;{&lt;/span&gt;&lt;span class=&quot;token&quot;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;token&quot;&gt;  &lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #24292e;&quot;&gt;$&lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #24292e;&quot;&gt;jobs&lt;/span&gt;&lt;span class=&quot;token&quot;&gt; &lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #d73a49;&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;token&quot;&gt; &lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #005cc5;&quot;&gt;$&lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #005cc5;&quot;&gt;this&lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #d73a49;&quot;&gt;-&amp;gt;&lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #24292e;&quot;&gt;zone&lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #d73a49;&quot;&gt;-&amp;gt;&lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #6f42c1;&quot;&gt;records&lt;/span&gt;&lt;span class=&quot;token&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #d73a49;&quot;&gt;-&amp;gt;&lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #6f42c1;&quot;&gt;get&lt;/span&gt;&lt;span class=&quot;token&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token&quot;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;token&quot;&gt;    &lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #d73a49;&quot;&gt;-&amp;gt;&lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #6f42c1;&quot;&gt;map&lt;/span&gt;&lt;span class=&quot;token&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #d73a49;&quot;&gt;fn&lt;/span&gt;&lt;span class=&quot;token&quot;&gt; &lt;/span&gt;&lt;span class=&quot;token&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #24292e;&quot;&gt;$&lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #24292e;&quot;&gt;record&lt;/span&gt;&lt;span class=&quot;token&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token&quot;&gt; &lt;/span&gt;&lt;span class=&quot;token&quot;&gt;=&amp;gt;&lt;/span&gt;&lt;span class=&quot;token&quot;&gt; &lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #d73a49;&quot;&gt;new&lt;/span&gt;&lt;span class=&quot;token&quot;&gt; &lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #005cc5;&quot;&gt;CheckZoneRecord&lt;/span&gt;&lt;span class=&quot;token&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #24292e;&quot;&gt;$&lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #24292e;&quot;&gt;record&lt;/span&gt;&lt;span class=&quot;token&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token&quot;&gt;;&lt;/span&gt;&lt;span class=&quot;token&quot;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;token&quot;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;token&quot;&gt;  &lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #005cc5;&quot;&gt;BackgroundTasks&lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #d73a49;&quot;&gt;::&lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #6f42c1;&quot;&gt;make&lt;/span&gt;&lt;span class=&quot;token&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #24292e;&quot;&gt;$&lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #24292e;&quot;&gt;jobs&lt;/span&gt;&lt;span class=&quot;token&quot;&gt;,&lt;/span&gt;&lt;span class=&quot;token&quot;&gt; &lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #005cc5;&quot;&gt;$&lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #005cc5;&quot;&gt;this&lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #d73a49;&quot;&gt;-&amp;gt;&lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #24292e;&quot;&gt;user&lt;/span&gt;&lt;span class=&quot;token&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token&quot;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;token&quot;&gt;    &lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #d73a49;&quot;&gt;-&amp;gt;&lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #6f42c1;&quot;&gt;setTitle&lt;/span&gt;&lt;span class=&quot;token&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #032f62;&quot;&gt;&amp;#039;&lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #032f62;&quot;&gt;Checking for new issues&lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #032f62;&quot;&gt;&amp;#039;&lt;/span&gt;&lt;span class=&quot;token&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token&quot;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;token&quot;&gt;    &lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #d73a49;&quot;&gt;-&amp;gt;&lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #6f42c1;&quot;&gt;setSuccessNotification&lt;/span&gt;&lt;span class=&quot;token&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #d73a49;&quot;&gt;function&lt;/span&gt;&lt;span class=&quot;token&quot;&gt; &lt;/span&gt;&lt;span class=&quot;token&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #005cc5;&quot;&gt;Notification&lt;/span&gt;&lt;span class=&quot;token&quot;&gt; &lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #24292e;&quot;&gt;$&lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #24292e;&quot;&gt;notification&lt;/span&gt;&lt;span class=&quot;token&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token&quot;&gt; &lt;/span&gt;&lt;span class=&quot;token&quot;&gt;{&lt;/span&gt;&lt;span class=&quot;token&quot;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;token&quot;&gt;		&lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #d73a49;&quot;&gt;return&lt;/span&gt;&lt;span class=&quot;token&quot;&gt; &lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #24292e;&quot;&gt;$&lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #24292e;&quot;&gt;notification&lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #d73a49;&quot;&gt;-&amp;gt;&lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #6f42c1;&quot;&gt;title&lt;/span&gt;&lt;span class=&quot;token&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #032f62;&quot;&gt;&amp;#039;&lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #032f62;&quot;&gt;Issues checked !&lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #032f62;&quot;&gt;&amp;#039;&lt;/span&gt;&lt;span class=&quot;token&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token&quot;&gt;;&lt;/span&gt;&lt;span class=&quot;token&quot;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;token&quot;&gt;    &lt;/span&gt;&lt;span class=&quot;token&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;token&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token&quot;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;token&quot;&gt;    &lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #d73a49;&quot;&gt;-&amp;gt;&lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #6f42c1;&quot;&gt;dispatch&lt;/span&gt;&lt;span class=&quot;token&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token&quot;&gt;;&lt;/span&gt;&lt;span class=&quot;token&quot;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;token&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;token&quot;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;And here it is !&lt;/p&gt;
&lt;div class=&quot;flex justify-around&quot;&gt;&lt;iframe width=&quot;560&quot; height=&quot;315&quot; src=&quot;https://www.youtube.com/embed/OvI5Hu9-owU?si=5fyb3yU0vBk-uEvF&amp;rel=0&amp;showinfo=0&amp;modestbranding=1&quot; title=&quot;YouTube video player&quot; frameborder=&quot;0&quot; allow=&quot;accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture; web-share&quot; referrerpolicy=&quot;strict-origin-when-cross-origin&quot; allowfullscreen&gt;&lt;/iframe&gt;&lt;/div&gt;
&lt;h2&gt;&lt;a id=&quot;content-security-concern&quot; href=&quot;#content-security-concern&quot; class=&quot;heading-permalink&quot; aria-hidden=&quot;true&quot; tabindex=&quot;-1&quot; title=&quot;Permalink&quot;&gt;#&lt;/a&gt;Security concern&lt;/h2&gt;
&lt;p&gt;Since I know that I'm not using any HTML in my notifications, my version uses &lt;code&gt;x-text&lt;/code&gt;. In this article, I changed it to &lt;code&gt;x-html&lt;/code&gt; so it will not break your application. That should not be a problem security-wise, but be aware that the body sent through the websocket is not sanitized by &lt;code&gt;str($body)-&amp;gt;sanitizeHtml()&lt;/code&gt; neither by AlpineJS.&lt;/p&gt;
&lt;p&gt;Basically, if your websocket server is compromised (or if you use a Public channel, I'm not sure): the attacker could send any HTML he wants in your DOM.&lt;/p&gt;
&lt;p&gt;If you don't use any HTML in your notification, change it to &lt;code&gt;x-text&lt;/code&gt; to be sure. Or read the last part of this article where I explain how to do even better by customizing even more Filament.&lt;/p&gt;
&lt;h2&gt;&lt;a id=&quot;content-how-can-we-do-more&quot; href=&quot;#content-how-can-we-do-more&quot; class=&quot;heading-permalink&quot; aria-hidden=&quot;true&quot; tabindex=&quot;-1&quot; title=&quot;Permalink&quot;&gt;#&lt;/a&gt;How can we do more?&lt;/h2&gt;
&lt;p&gt;I don't know what's on the roadmap of Filament v4 but I hope this feature will be included in the next release. Or at least I hope this article will push someone make a PR to Filament.&lt;/p&gt;
&lt;p&gt;I almost made a package of it but I don't think this version is worth it.&lt;/p&gt;
&lt;p&gt;If you are brave enough, here is a list of things I would do differently:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Support for database notifications: For now, only broadcasted notification support this feature but it should be easy enought to update the notification in the database.&lt;/li&gt;
&lt;li&gt;Add a new variable to mark the notification as updateable so they could be rebroadcasted if you open a new tab. Like a really persistent notification.&lt;/li&gt;
&lt;li&gt;Make a sub livewire component for each Notification to clean the code and have them listen to events dedicated to them. This will also help preventing XSS.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Hope you liked this article!&lt;/p&gt;</summary>
        <content type="html">&lt;p&gt;While working on &lt;a href=&quot;https://unolia.com&quot;&gt;unolia.com&lt;/a&gt; I made a little upgrade to my notifications! I wanted my user to have feedback on the progress of the tasks. In one PHP class, no additional table, clean API.&lt;!-- more --&gt;&lt;/p&gt;
&lt;ul class=&quot;table-of-contents not-prose&quot;&gt;
&lt;li&gt;&lt;a href=&quot;#content-prerequisites&quot;&gt;Prerequisites&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;#content-the-problem&quot;&gt;The problem&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;#content-the-solution&quot;&gt;The solution&lt;/a&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;#content-customize-filament&quot;&gt;Customize Filament&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;#content-create-a-new-helper-class-&quot;&gt;Create a new helper class 🎨&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;#content-use-it-on-your-project&quot;&gt;Use it on your project&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;#content-security-concern&quot;&gt;Security concern&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;#content-how-can-we-do-more&quot;&gt;How can we do more?&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;&lt;a id=&quot;content-prerequisites&quot; href=&quot;#content-prerequisites&quot; class=&quot;heading-permalink&quot; aria-hidden=&quot;true&quot; tabindex=&quot;-1&quot; title=&quot;Permalink&quot;&gt;#&lt;/a&gt;Prerequisites&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;Laravel 11 app (with at least job batches and anonymous events)&lt;/li&gt;
&lt;li&gt;Laravel Reverb installed and configured&lt;/li&gt;
&lt;li&gt;Filament v3 Notifications&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;&lt;a id=&quot;content-the-problem&quot; href=&quot;#content-the-problem&quot; class=&quot;heading-permalink&quot; aria-hidden=&quot;true&quot; tabindex=&quot;-1&quot; title=&quot;Permalink&quot;&gt;#&lt;/a&gt;The problem&lt;/h2&gt;
&lt;p&gt;To better understand what we are trying to improve, here is the current Livewire function that is called when the user requests issues to be checked.&lt;/p&gt;
&lt;div x-data=&quot;codeBlock&quot; class=&quot;code-block relative&quot;&gt;&lt;div class=&quot;flex space-x-2 items-center absolute top-0 right-0&quot;&gt;
    &lt;div x-cloak x-show=&quot;showMessage&quot; x-transition class=&quot;py-2 animate-bounce transition duration-300 mt-1 text-sky-500 text-xs&quot;&gt;Copied!&lt;/div&gt;
    &lt;button
        type=&quot;button&quot;
        title=&quot;Copy to clipboard&quot;
        class=&quot;hidden sm:block p-2 pl-3 transition duration-300&quot;
        @click.prevent=&quot;copyToClipboard&quot;
        :class=&quot;{
            'text-black/30 hover:text-black/80': !showMessage,
            'text-sky-500 hover:text-sky-700': showMessage,
        }&quot;&gt;
        &lt;svg xmlns=&quot;http://www.w3.org/2000/svg&quot; fill=&quot;none&quot; viewBox=&quot;0 0 24 24&quot; stroke-width=&quot;1.5&quot; stroke=&quot;currentColor&quot; class=&quot;block w-6 h-6&quot;&gt;
            &lt;path fill=&quot;white&quot; stroke-linecap=&quot;round&quot; stroke-linejoin=&quot;round&quot; d=&quot;M11.35 3.836c-.065.21-.1.433-.1.664 0 .414.336.75.75.75h4.5a.75.75 0 00.75-.75 2.25 2.25 0 00-.1-.664m-5.8 0A2.251 2.251 0 0113.5 2.25H15c1.012 0 1.867.668 2.15 1.586m-5.8 0c-.376.023-.75.05-1.124.08C9.095 4.01 8.25 4.973 8.25 6.108V8.25m8.9-4.414c.376.023.75.05 1.124.08 1.131.094 1.976 1.057 1.976 2.192V16.5A2.25 2.25 0 0118 18.75h-2.25m-7.5-10.5H4.875c-.621 0-1.125.504-1.125 1.125v11.25c0 .621.504 1.125 1.125 1.125h9.75c.621 0 1.125-.504 1.125-1.125V18.75m-7.5-10.5h6.375c.621 0 1.125.504 1.125 1.125v9.375m-8.25-3l1.5 1.5 3-3.75&quot; /&gt;
        &lt;/svg&gt;
    &lt;/button&gt;
&lt;/div&gt;&lt;pre class=&quot;phiki language-php github-light&quot; data-language=&quot;php&quot; style=&quot;background-color: #fff;color: #24292e;&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;token&quot;&gt;#[&lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #005cc5;&quot;&gt;Renderless&lt;/span&gt;&lt;span class=&quot;token&quot;&gt;]&lt;/span&gt;&lt;span class=&quot;token&quot;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;token&quot; style=&quot;color: #d73a49;&quot;&gt;public&lt;/span&gt;&lt;span class=&quot;token&quot;&gt; &lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #d73a49;&quot;&gt;function&lt;/span&gt;&lt;span class=&quot;token&quot;&gt; &lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #6f42c1;&quot;&gt;checkIssues&lt;/span&gt;&lt;span class=&quot;token&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token&quot;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;token&quot;&gt;{&lt;/span&gt;&lt;span class=&quot;token&quot;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;token&quot;&gt;  &lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #24292e;&quot;&gt;$&lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #24292e;&quot;&gt;records&lt;/span&gt;&lt;span class=&quot;token&quot;&gt; &lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #d73a49;&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;token&quot;&gt; &lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #005cc5;&quot;&gt;$&lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #005cc5;&quot;&gt;this&lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #d73a49;&quot;&gt;-&amp;gt;&lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #24292e;&quot;&gt;zone&lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #d73a49;&quot;&gt;-&amp;gt;&lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #6f42c1;&quot;&gt;records&lt;/span&gt;&lt;span class=&quot;token&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #d73a49;&quot;&gt;-&amp;gt;&lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #6f42c1;&quot;&gt;get&lt;/span&gt;&lt;span class=&quot;token&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token&quot;&gt;;&lt;/span&gt;&lt;span class=&quot;token&quot;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;token&quot;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;token&quot;&gt;  &lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #d73a49;&quot;&gt;foreach&lt;/span&gt;&lt;span class=&quot;token&quot;&gt; &lt;/span&gt;&lt;span class=&quot;token&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #24292e;&quot;&gt;$&lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #24292e;&quot;&gt;records&lt;/span&gt;&lt;span class=&quot;token&quot;&gt; &lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #d73a49;&quot;&gt;as&lt;/span&gt;&lt;span class=&quot;token&quot;&gt; &lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #24292e;&quot;&gt;$&lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #24292e;&quot;&gt;record&lt;/span&gt;&lt;span class=&quot;token&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token&quot;&gt; &lt;/span&gt;&lt;span class=&quot;token&quot;&gt;{&lt;/span&gt;&lt;span class=&quot;token&quot;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;token&quot;&gt;      &lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #6f42c1;&quot;&gt;dispatch&lt;/span&gt;&lt;span class=&quot;token&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #d73a49;&quot;&gt;new&lt;/span&gt;&lt;span class=&quot;token&quot;&gt; &lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #005cc5;&quot;&gt;CheckZoneRecord&lt;/span&gt;&lt;span class=&quot;token&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #24292e;&quot;&gt;$&lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #24292e;&quot;&gt;record&lt;/span&gt;&lt;span class=&quot;token&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token&quot;&gt;;&lt;/span&gt;&lt;span class=&quot;token&quot;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;token&quot;&gt;  &lt;/span&gt;&lt;span class=&quot;token&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;token&quot;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;token&quot;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;token&quot;&gt;  &lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #005cc5;&quot;&gt;Notification&lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #d73a49;&quot;&gt;::&lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #6f42c1;&quot;&gt;make&lt;/span&gt;&lt;span class=&quot;token&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token&quot;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;token&quot;&gt;    &lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #d73a49;&quot;&gt;-&amp;gt;&lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #6f42c1;&quot;&gt;title&lt;/span&gt;&lt;span class=&quot;token&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #032f62;&quot;&gt;&amp;#039;&lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #032f62;&quot;&gt;New issues checks have been requested&lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #032f62;&quot;&gt;&amp;#039;&lt;/span&gt;&lt;span class=&quot;token&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token&quot;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;token&quot;&gt;    &lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #d73a49;&quot;&gt;-&amp;gt;&lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #6f42c1;&quot;&gt;success&lt;/span&gt;&lt;span class=&quot;token&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token&quot;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;token&quot;&gt;    &lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #d73a49;&quot;&gt;-&amp;gt;&lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #6f42c1;&quot;&gt;send&lt;/span&gt;&lt;span class=&quot;token&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token&quot;&gt;;&lt;/span&gt;&lt;span class=&quot;token&quot;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;token&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;token&quot;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;This function does two things:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;Sending &lt;code&gt;CheckZoneRecord&lt;/code&gt; jobs to the queues&lt;/li&gt;
&lt;li&gt;Sending a visual notification, more like a toast, telling the user that the checks have started.&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;Depending on the part of my application, they also receive a notification when the background task is done. But here I have a batch of jobs and there is no way that one job will know and be responsible to send this success notification.&lt;/p&gt;
&lt;p&gt;That was the first challenge: how to tell the user that checks are done? Easy. Use job batch to send a notification when it's done.&lt;/p&gt;
&lt;div x-data=&quot;codeBlock&quot; class=&quot;code-block relative&quot;&gt;&lt;div class=&quot;flex space-x-2 items-center absolute top-0 right-0&quot;&gt;
    &lt;div x-cloak x-show=&quot;showMessage&quot; x-transition class=&quot;py-2 animate-bounce transition duration-300 mt-1 text-sky-500 text-xs&quot;&gt;Copied!&lt;/div&gt;
    &lt;button
        type=&quot;button&quot;
        title=&quot;Copy to clipboard&quot;
        class=&quot;hidden sm:block p-2 pl-3 transition duration-300&quot;
        @click.prevent=&quot;copyToClipboard&quot;
        :class=&quot;{
            'text-black/30 hover:text-black/80': !showMessage,
            'text-sky-500 hover:text-sky-700': showMessage,
        }&quot;&gt;
        &lt;svg xmlns=&quot;http://www.w3.org/2000/svg&quot; fill=&quot;none&quot; viewBox=&quot;0 0 24 24&quot; stroke-width=&quot;1.5&quot; stroke=&quot;currentColor&quot; class=&quot;block w-6 h-6&quot;&gt;
            &lt;path fill=&quot;white&quot; stroke-linecap=&quot;round&quot; stroke-linejoin=&quot;round&quot; d=&quot;M11.35 3.836c-.065.21-.1.433-.1.664 0 .414.336.75.75.75h4.5a.75.75 0 00.75-.75 2.25 2.25 0 00-.1-.664m-5.8 0A2.251 2.251 0 0113.5 2.25H15c1.012 0 1.867.668 2.15 1.586m-5.8 0c-.376.023-.75.05-1.124.08C9.095 4.01 8.25 4.973 8.25 6.108V8.25m8.9-4.414c.376.023.75.05 1.124.08 1.131.094 1.976 1.057 1.976 2.192V16.5A2.25 2.25 0 0118 18.75h-2.25m-7.5-10.5H4.875c-.621 0-1.125.504-1.125 1.125v11.25c0 .621.504 1.125 1.125 1.125h9.75c.621 0 1.125-.504 1.125-1.125V18.75m-7.5-10.5h6.375c.621 0 1.125.504 1.125 1.125v9.375m-8.25-3l1.5 1.5 3-3.75&quot; /&gt;
        &lt;/svg&gt;
    &lt;/button&gt;
&lt;/div&gt;&lt;pre class=&quot;phiki language-php github-light&quot; data-language=&quot;php&quot; style=&quot;background-color: #fff;color: #24292e;&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;token&quot; style=&quot;color: #005cc5;&quot;&gt;Bus&lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #d73a49;&quot;&gt;::&lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #6f42c1;&quot;&gt;batch&lt;/span&gt;&lt;span class=&quot;token&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #24292e;&quot;&gt;$&lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #24292e;&quot;&gt;jobs&lt;/span&gt;&lt;span class=&quot;token&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #d73a49;&quot;&gt;-&amp;gt;&lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #6f42c1;&quot;&gt;finally&lt;/span&gt;&lt;span class=&quot;token&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #d73a49;&quot;&gt;fn&lt;/span&gt;&lt;span class=&quot;token&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token&quot;&gt; &lt;/span&gt;&lt;span class=&quot;token&quot;&gt;=&amp;gt;&lt;/span&gt;&lt;span class=&quot;token&quot;&gt; &lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #6f42c1;&quot;&gt;sendSuccessNotification&lt;/span&gt;&lt;span class=&quot;token&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token&quot;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;But like I said, I already had this kind of user experience in my app.&lt;/p&gt;
&lt;p&gt;I wanted more!&lt;/p&gt;
&lt;p&gt;I wanted a progress bar!&lt;/p&gt;
&lt;h2&gt;&lt;a id=&quot;content-the-solution&quot; href=&quot;#content-the-solution&quot; class=&quot;heading-permalink&quot; aria-hidden=&quot;true&quot; tabindex=&quot;-1&quot; title=&quot;Permalink&quot;&gt;#&lt;/a&gt;The solution&lt;/h2&gt;
&lt;p&gt;I wanted the solution to be as seamless and transparent as possible, but in the end, I had to slightly customize Filament.&lt;/p&gt;
&lt;h3&gt;&lt;a id=&quot;content-customize-filament&quot; href=&quot;#content-customize-filament&quot; class=&quot;heading-permalink&quot; aria-hidden=&quot;true&quot; tabindex=&quot;-1&quot; title=&quot;Permalink&quot;&gt;#&lt;/a&gt;Customize Filament&lt;/h3&gt;
&lt;p&gt;We are going to use our own view for the notifications, so go to &lt;code&gt;AppServiceProvider.php&lt;/code&gt; and thoses lines int the &lt;code&gt;boot()&lt;/code&gt; function:&lt;/p&gt;
&lt;div x-data=&quot;codeBlock&quot; class=&quot;code-block relative&quot;&gt;&lt;div class=&quot;flex space-x-2 items-center absolute top-0 right-0&quot;&gt;
    &lt;div x-cloak x-show=&quot;showMessage&quot; x-transition class=&quot;py-2 animate-bounce transition duration-300 mt-1 text-sky-500 text-xs&quot;&gt;Copied!&lt;/div&gt;
    &lt;button
        type=&quot;button&quot;
        title=&quot;Copy to clipboard&quot;
        class=&quot;hidden sm:block p-2 pl-3 transition duration-300&quot;
        @click.prevent=&quot;copyToClipboard&quot;
        :class=&quot;{
            'text-black/30 hover:text-black/80': !showMessage,
            'text-sky-500 hover:text-sky-700': showMessage,
        }&quot;&gt;
        &lt;svg xmlns=&quot;http://www.w3.org/2000/svg&quot; fill=&quot;none&quot; viewBox=&quot;0 0 24 24&quot; stroke-width=&quot;1.5&quot; stroke=&quot;currentColor&quot; class=&quot;block w-6 h-6&quot;&gt;
            &lt;path fill=&quot;white&quot; stroke-linecap=&quot;round&quot; stroke-linejoin=&quot;round&quot; d=&quot;M11.35 3.836c-.065.21-.1.433-.1.664 0 .414.336.75.75.75h4.5a.75.75 0 00.75-.75 2.25 2.25 0 00-.1-.664m-5.8 0A2.251 2.251 0 0113.5 2.25H15c1.012 0 1.867.668 2.15 1.586m-5.8 0c-.376.023-.75.05-1.124.08C9.095 4.01 8.25 4.973 8.25 6.108V8.25m8.9-4.414c.376.023.75.05 1.124.08 1.131.094 1.976 1.057 1.976 2.192V16.5A2.25 2.25 0 0118 18.75h-2.25m-7.5-10.5H4.875c-.621 0-1.125.504-1.125 1.125v11.25c0 .621.504 1.125 1.125 1.125h9.75c.621 0 1.125-.504 1.125-1.125V18.75m-7.5-10.5h6.375c.621 0 1.125.504 1.125 1.125v9.375m-8.25-3l1.5 1.5 3-3.75&quot; /&gt;
        &lt;/svg&gt;
    &lt;/button&gt;
&lt;/div&gt;&lt;pre class=&quot;phiki language-php github-light&quot; data-language=&quot;php&quot; style=&quot;background-color: #fff;color: #24292e;&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;token&quot; style=&quot;color: #005cc5;&quot;&gt;Notification&lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #d73a49;&quot;&gt;::&lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #6f42c1;&quot;&gt;configureUsing&lt;/span&gt;&lt;span class=&quot;token&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #d73a49;&quot;&gt;function&lt;/span&gt;&lt;span class=&quot;token&quot;&gt; &lt;/span&gt;&lt;span class=&quot;token&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #005cc5;&quot;&gt;Notification&lt;/span&gt;&lt;span class=&quot;token&quot;&gt; &lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #24292e;&quot;&gt;$&lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #24292e;&quot;&gt;notification&lt;/span&gt;&lt;span class=&quot;token&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #d73a49;&quot;&gt;:&lt;/span&gt;&lt;span class=&quot;token&quot;&gt; &lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #d73a49;&quot;&gt;void&lt;/span&gt;&lt;span class=&quot;token&quot;&gt; &lt;/span&gt;&lt;span class=&quot;token&quot;&gt;{&lt;/span&gt;&lt;span class=&quot;token&quot;&gt; 
&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;token&quot;&gt;  &lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #24292e;&quot;&gt;$&lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #24292e;&quot;&gt;notification&lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #d73a49;&quot;&gt;-&amp;gt;&lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #6f42c1;&quot;&gt;view&lt;/span&gt;&lt;span class=&quot;token&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #032f62;&quot;&gt;&amp;#039;&lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #032f62;&quot;&gt;components.notification&lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #032f62;&quot;&gt;&amp;#039;&lt;/span&gt;&lt;span class=&quot;token&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token&quot;&gt;;&lt;/span&gt;&lt;span class=&quot;token&quot;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;token&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;token&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token&quot;&gt;;&lt;/span&gt;&lt;span class=&quot;token&quot;&gt; 
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;Original file:&lt;br /&gt;
&lt;code&gt;vendor/filament/notifications/resources/views/notification.blade.php&lt;/code&gt;&lt;/p&gt;
&lt;p&gt;Now create the component with&lt;/p&gt;
&lt;div x-data=&quot;codeBlock&quot; class=&quot;code-block relative&quot;&gt;&lt;div class=&quot;flex space-x-2 items-center absolute top-0 right-0&quot;&gt;
    &lt;div x-cloak x-show=&quot;showMessage&quot; x-transition class=&quot;py-2 animate-bounce transition duration-300 mt-1 text-sky-500 text-xs&quot;&gt;Copied!&lt;/div&gt;
    &lt;button
        type=&quot;button&quot;
        title=&quot;Copy to clipboard&quot;
        class=&quot;hidden sm:block p-2 pl-3 transition duration-300&quot;
        @click.prevent=&quot;copyToClipboard&quot;
        :class=&quot;{
            'text-black/30 hover:text-black/80': !showMessage,
            'text-sky-500 hover:text-sky-700': showMessage,
        }&quot;&gt;
        &lt;svg xmlns=&quot;http://www.w3.org/2000/svg&quot; fill=&quot;none&quot; viewBox=&quot;0 0 24 24&quot; stroke-width=&quot;1.5&quot; stroke=&quot;currentColor&quot; class=&quot;block w-6 h-6&quot;&gt;
            &lt;path fill=&quot;white&quot; stroke-linecap=&quot;round&quot; stroke-linejoin=&quot;round&quot; d=&quot;M11.35 3.836c-.065.21-.1.433-.1.664 0 .414.336.75.75.75h4.5a.75.75 0 00.75-.75 2.25 2.25 0 00-.1-.664m-5.8 0A2.251 2.251 0 0113.5 2.25H15c1.012 0 1.867.668 2.15 1.586m-5.8 0c-.376.023-.75.05-1.124.08C9.095 4.01 8.25 4.973 8.25 6.108V8.25m8.9-4.414c.376.023.75.05 1.124.08 1.131.094 1.976 1.057 1.976 2.192V16.5A2.25 2.25 0 0118 18.75h-2.25m-7.5-10.5H4.875c-.621 0-1.125.504-1.125 1.125v11.25c0 .621.504 1.125 1.125 1.125h9.75c.621 0 1.125-.504 1.125-1.125V18.75m-7.5-10.5h6.375c.621 0 1.125.504 1.125 1.125v9.375m-8.25-3l1.5 1.5 3-3.75&quot; /&gt;
        &lt;/svg&gt;
    &lt;/button&gt;
&lt;/div&gt;&lt;pre class=&quot;phiki language-shellscript github-light&quot; data-language=&quot;shellscript&quot; style=&quot;background-color: #fff;color: #24292e;&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;token&quot; style=&quot;color: #6f42c1;&quot;&gt;php&lt;/span&gt;&lt;span class=&quot;token&quot;&gt; &lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #032f62;&quot;&gt;artisan&lt;/span&gt;&lt;span class=&quot;token&quot;&gt; &lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #032f62;&quot;&gt;make:component&lt;/span&gt;&lt;span class=&quot;token&quot;&gt; &lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #032f62;&quot;&gt;notification&lt;/span&gt;&lt;span class=&quot;token&quot;&gt; &lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #005cc5;&quot;&gt;-&lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #005cc5;&quot;&gt;-view&lt;/span&gt;&lt;span class=&quot;token&quot;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;Copy and paste the content of the original file and and modify the body part:&lt;/p&gt;
&lt;div x-data=&quot;codeBlock&quot; class=&quot;code-block relative&quot;&gt;&lt;div class=&quot;flex space-x-2 items-center absolute top-0 right-0&quot;&gt;
    &lt;div x-cloak x-show=&quot;showMessage&quot; x-transition class=&quot;py-2 animate-bounce transition duration-300 mt-1 text-sky-500 text-xs&quot;&gt;Copied!&lt;/div&gt;
    &lt;button
        type=&quot;button&quot;
        title=&quot;Copy to clipboard&quot;
        class=&quot;hidden sm:block p-2 pl-3 transition duration-300&quot;
        @click.prevent=&quot;copyToClipboard&quot;
        :class=&quot;{
            'text-black/30 hover:text-black/80': !showMessage,
            'text-sky-500 hover:text-sky-700': showMessage,
        }&quot;&gt;
        &lt;svg xmlns=&quot;http://www.w3.org/2000/svg&quot; fill=&quot;none&quot; viewBox=&quot;0 0 24 24&quot; stroke-width=&quot;1.5&quot; stroke=&quot;currentColor&quot; class=&quot;block w-6 h-6&quot;&gt;
            &lt;path fill=&quot;white&quot; stroke-linecap=&quot;round&quot; stroke-linejoin=&quot;round&quot; d=&quot;M11.35 3.836c-.065.21-.1.433-.1.664 0 .414.336.75.75.75h4.5a.75.75 0 00.75-.75 2.25 2.25 0 00-.1-.664m-5.8 0A2.251 2.251 0 0113.5 2.25H15c1.012 0 1.867.668 2.15 1.586m-5.8 0c-.376.023-.75.05-1.124.08C9.095 4.01 8.25 4.973 8.25 6.108V8.25m8.9-4.414c.376.023.75.05 1.124.08 1.131.094 1.976 1.057 1.976 2.192V16.5A2.25 2.25 0 0118 18.75h-2.25m-7.5-10.5H4.875c-.621 0-1.125.504-1.125 1.125v11.25c0 .621.504 1.125 1.125 1.125h9.75c.621 0 1.125-.504 1.125-1.125V18.75m-7.5-10.5h6.375c.621 0 1.125.504 1.125 1.125v9.375m-8.25-3l1.5 1.5 3-3.75&quot; /&gt;
        &lt;/svg&gt;
    &lt;/button&gt;
&lt;/div&gt;&lt;pre class=&quot;phiki language-php github-light&quot; data-language=&quot;php&quot; style=&quot;background-color: #fff;color: #24292e;&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;token&quot; style=&quot;color: #d73a49;&quot;&gt;@&lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #005cc5;&quot;&gt;php&lt;/span&gt;&lt;span class=&quot;token&quot;&gt; 
&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;token&quot;&gt;    &lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #d73a49;&quot;&gt;use&lt;/span&gt;&lt;span class=&quot;token&quot;&gt; &lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #005cc5;&quot;&gt;Filament&lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #005cc5;&quot;&gt;\&lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #005cc5;&quot;&gt;Notifications&lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #005cc5;&quot;&gt;\&lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #005cc5;&quot;&gt;Livewire&lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #005cc5;&quot;&gt;\&lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #005cc5;&quot;&gt;Notifications&lt;/span&gt;&lt;span class=&quot;token&quot;&gt;;&lt;/span&gt;&lt;span class=&quot;token&quot;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;token&quot;&gt;    &lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #d73a49;&quot;&gt;use&lt;/span&gt;&lt;span class=&quot;token&quot;&gt; &lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #005cc5;&quot;&gt;Filament&lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #005cc5;&quot;&gt;\&lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #005cc5;&quot;&gt;Support&lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #005cc5;&quot;&gt;\&lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #005cc5;&quot;&gt;Enums&lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #005cc5;&quot;&gt;\&lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #005cc5;&quot;&gt;Alignment&lt;/span&gt;&lt;span class=&quot;token&quot;&gt;;&lt;/span&gt;&lt;span class=&quot;token&quot;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;token&quot;&gt;    &lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #d73a49;&quot;&gt;use&lt;/span&gt;&lt;span class=&quot;token&quot;&gt; &lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #005cc5;&quot;&gt;Filament&lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #005cc5;&quot;&gt;\&lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #005cc5;&quot;&gt;Support&lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #005cc5;&quot;&gt;\&lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #005cc5;&quot;&gt;Enums&lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #005cc5;&quot;&gt;\&lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #005cc5;&quot;&gt;VerticalAlignment&lt;/span&gt;&lt;span class=&quot;token&quot;&gt;;&lt;/span&gt;&lt;span class=&quot;token&quot;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;token&quot;&gt;    &lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #d73a49;&quot;&gt;use&lt;/span&gt;&lt;span class=&quot;token&quot;&gt; &lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #005cc5;&quot;&gt;Illuminate&lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #005cc5;&quot;&gt;\&lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #005cc5;&quot;&gt;Support&lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #005cc5;&quot;&gt;\&lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #005cc5;&quot;&gt;Arr&lt;/span&gt;&lt;span class=&quot;token&quot;&gt;;&lt;/span&gt;&lt;span class=&quot;token&quot;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;token&quot;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;token&quot;&gt;    &lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #24292e;&quot;&gt;$&lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #24292e;&quot;&gt;color&lt;/span&gt;&lt;span class=&quot;token&quot;&gt; &lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #d73a49;&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;token&quot;&gt; &lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #24292e;&quot;&gt;$&lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #24292e;&quot;&gt;getColor&lt;/span&gt;&lt;span class=&quot;token&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token&quot;&gt; &lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #d73a49;&quot;&gt;??&lt;/span&gt;&lt;span class=&quot;token&quot;&gt; &lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #032f62;&quot;&gt;&amp;#039;&lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #032f62;&quot;&gt;gray&lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #032f62;&quot;&gt;&amp;#039;&lt;/span&gt;&lt;span class=&quot;token&quot;&gt;;&lt;/span&gt;&lt;span class=&quot;token&quot;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;token&quot;&gt;    &lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #24292e;&quot;&gt;$&lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #24292e;&quot;&gt;isInline&lt;/span&gt;&lt;span class=&quot;token&quot;&gt; &lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #d73a49;&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;token&quot;&gt; &lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #24292e;&quot;&gt;$&lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #24292e;&quot;&gt;isInline&lt;/span&gt;&lt;span class=&quot;token&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token&quot;&gt;;&lt;/span&gt;&lt;span class=&quot;token&quot;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;token&quot;&gt;    &lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #24292e;&quot;&gt;$&lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #24292e;&quot;&gt;status&lt;/span&gt;&lt;span class=&quot;token&quot;&gt; &lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #d73a49;&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;token&quot;&gt; &lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #24292e;&quot;&gt;$&lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #24292e;&quot;&gt;getStatus&lt;/span&gt;&lt;span class=&quot;token&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token&quot;&gt;;&lt;/span&gt;&lt;span class=&quot;token&quot;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;token&quot;&gt;    &lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #24292e;&quot;&gt;$&lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #24292e;&quot;&gt;title&lt;/span&gt;&lt;span class=&quot;token&quot;&gt; &lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #d73a49;&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;token&quot;&gt; &lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #24292e;&quot;&gt;$&lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #24292e;&quot;&gt;getTitle&lt;/span&gt;&lt;span class=&quot;token&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token&quot;&gt;;&lt;/span&gt;&lt;span class=&quot;token&quot;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;token&quot;&gt;    &lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #24292e;&quot;&gt;$&lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #24292e;&quot;&gt;hasTitle&lt;/span&gt;&lt;span class=&quot;token&quot;&gt; &lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #d73a49;&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;token&quot;&gt; &lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #6f42c1;&quot;&gt;filled&lt;/span&gt;&lt;span class=&quot;token&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #24292e;&quot;&gt;$&lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #24292e;&quot;&gt;title&lt;/span&gt;&lt;span class=&quot;token&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token&quot;&gt;;&lt;/span&gt;&lt;span class=&quot;token&quot;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;token&quot;&gt;    &lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #24292e;&quot;&gt;$&lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #24292e;&quot;&gt;date&lt;/span&gt;&lt;span class=&quot;token&quot;&gt; &lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #d73a49;&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;token&quot;&gt; &lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #24292e;&quot;&gt;$&lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #24292e;&quot;&gt;getDate&lt;/span&gt;&lt;span class=&quot;token&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token&quot;&gt;;&lt;/span&gt;&lt;span class=&quot;token&quot;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;token&quot;&gt;    &lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #24292e;&quot;&gt;$&lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #24292e;&quot;&gt;hasDate&lt;/span&gt;&lt;span class=&quot;token&quot;&gt; &lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #d73a49;&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;token&quot;&gt; &lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #6f42c1;&quot;&gt;filled&lt;/span&gt;&lt;span class=&quot;token&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #24292e;&quot;&gt;$&lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #24292e;&quot;&gt;date&lt;/span&gt;&lt;span class=&quot;token&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token&quot;&gt;;&lt;/span&gt;&lt;span class=&quot;token&quot;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;token&quot;&gt;    &lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #24292e;&quot;&gt;$&lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #24292e;&quot;&gt;body&lt;/span&gt;&lt;span class=&quot;token&quot;&gt; &lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #d73a49;&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;token&quot;&gt; &lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #24292e;&quot;&gt;$&lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #24292e;&quot;&gt;getBody&lt;/span&gt;&lt;span class=&quot;token&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token&quot;&gt;;&lt;/span&gt;&lt;span class=&quot;token&quot;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;token&quot;&gt;    &lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #24292e;&quot;&gt;$&lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #24292e;&quot;&gt;hasBody&lt;/span&gt;&lt;span class=&quot;token&quot;&gt; &lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #d73a49;&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;token&quot;&gt; &lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #6f42c1;&quot;&gt;filled&lt;/span&gt;&lt;span class=&quot;token&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #24292e;&quot;&gt;$&lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #24292e;&quot;&gt;body&lt;/span&gt;&lt;span class=&quot;token&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token&quot;&gt;;&lt;/span&gt;&lt;span class=&quot;token&quot;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;token&quot; style=&quot;color: #d73a49;&quot;&gt;@&lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #005cc5;&quot;&gt;endphp&lt;/span&gt;&lt;span class=&quot;token&quot;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;token&quot;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;token&quot; style=&quot;color: #d73a49;&quot;&gt;&amp;lt;&lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #005cc5;&quot;&gt;x&lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #d73a49;&quot;&gt;-&lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #005cc5;&quot;&gt;filament&lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #d73a49;&quot;&gt;-&lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #005cc5;&quot;&gt;notifications&lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #d73a49;&quot;&gt;::&lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #005cc5;&quot;&gt;notification&lt;/span&gt;&lt;span class=&quot;token&quot;&gt; 
&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;token&quot;&gt;    &lt;/span&gt;&lt;span class=&quot;token&quot;&gt;:&lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #005cc5;&quot;&gt;notification&lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #d73a49;&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #032f62;&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #032f62;&quot;&gt;$&lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #24292e;&quot;&gt;notification&lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #032f62;&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span class=&quot;token&quot;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;token&quot;&gt;    &lt;/span&gt;&lt;span class=&quot;token&quot;&gt;:&lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #005cc5;&quot;&gt;x&lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #d73a49;&quot;&gt;-&lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #005cc5;&quot;&gt;transition&lt;/span&gt;&lt;span class=&quot;token&quot;&gt;:&lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #005cc5;&quot;&gt;enter&lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #d73a49;&quot;&gt;-&lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #005cc5;&quot;&gt;start&lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #d73a49;&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #032f62;&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #032f62;&quot;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;token&quot; style=&quot;color: #032f62;&quot;&gt;        Arr::toCssClasses([
&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;token&quot; style=&quot;color: #032f62;&quot;&gt;            &amp;#039;opacity-0&amp;#039;,
&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;token&quot; style=&quot;color: #032f62;&quot;&gt;            (&lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #032f62;&quot;&gt;$&lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #24292e;&quot;&gt;this&lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #032f62;&quot;&gt; &lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #032f62;&quot;&gt;instanceof Notifications)
&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;token&quot; style=&quot;color: #032f62;&quot;&gt;            ? match (static::&lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #032f62;&quot;&gt;$&lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #24292e;&quot;&gt;alignment&lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #032f62;&quot;&gt;) {
&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;token&quot; style=&quot;color: #032f62;&quot;&gt;                Alignment::Start, Alignment::Left =&amp;gt; &amp;#039;-translate-x-12&amp;#039;,
&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;token&quot; style=&quot;color: #032f62;&quot;&gt;                Alignment::End, Alignment::Right =&amp;gt; &amp;#039;translate-x-12&amp;#039;,
&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;token&quot; style=&quot;color: #032f62;&quot;&gt;                Alignment::Center =&amp;gt; match (static::&lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #032f62;&quot;&gt;$&lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #24292e;&quot;&gt;verticalAlignment&lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #032f62;&quot;&gt;) {
&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;token&quot; style=&quot;color: #032f62;&quot;&gt;                    VerticalAlignment::Start =&amp;gt; &amp;#039;-translate-y-12&amp;#039;,
&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;token&quot; style=&quot;color: #032f62;&quot;&gt;                    VerticalAlignment::End =&amp;gt; &amp;#039;translate-y-12&amp;#039;,
&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;token&quot; style=&quot;color: #032f62;&quot;&gt;                    default =&amp;gt; null,
&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;token&quot; style=&quot;color: #032f62;&quot;&gt;                },
&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;token&quot; style=&quot;color: #032f62;&quot;&gt;                default =&amp;gt; null,
&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;token&quot; style=&quot;color: #032f62;&quot;&gt;            }
&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;token&quot; style=&quot;color: #032f62;&quot;&gt;            : null,
&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;token&quot; style=&quot;color: #032f62;&quot;&gt;        ])
&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;token&quot; style=&quot;color: #032f62;&quot;&gt;    &lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #032f62;&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span class=&quot;token&quot;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;token&quot;&gt;    &lt;/span&gt;&lt;span class=&quot;token&quot;&gt;:&lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #005cc5;&quot;&gt;x&lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #d73a49;&quot;&gt;-&lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #005cc5;&quot;&gt;transition&lt;/span&gt;&lt;span class=&quot;token&quot;&gt;:&lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #005cc5;&quot;&gt;leave&lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #d73a49;&quot;&gt;-&lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #005cc5;&quot;&gt;end&lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #d73a49;&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #032f62;&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #032f62;&quot;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;token&quot; style=&quot;color: #032f62;&quot;&gt;        Arr::toCssClasses([
&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;token&quot; style=&quot;color: #032f62;&quot;&gt;            &amp;#039;opacity-0&amp;#039;,
&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;token&quot; style=&quot;color: #032f62;&quot;&gt;            &amp;#039;scale-95&amp;#039; =&amp;gt; ! &lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #032f62;&quot;&gt;$&lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #24292e;&quot;&gt;isInline&lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #032f62;&quot;&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;token&quot; style=&quot;color: #032f62;&quot;&gt;        ])
&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;token&quot; style=&quot;color: #032f62;&quot;&gt;    &lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #032f62;&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span class=&quot;token&quot;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;token&quot;&gt;    &lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #d73a49;&quot;&gt;@&lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #d73a49;&quot;&gt;class&lt;/span&gt;&lt;span class=&quot;token&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;token&quot;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;token&quot;&gt;        &lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #032f62;&quot;&gt;&amp;#039;&lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #032f62;&quot;&gt;fi-no-notification w-full overflow-hidden transition duration-300&lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #032f62;&quot;&gt;&amp;#039;&lt;/span&gt;&lt;span class=&quot;token&quot;&gt;,&lt;/span&gt;&lt;span class=&quot;token&quot;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;token&quot;&gt;        &lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #d73a49;&quot;&gt;...&lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #d73a49;&quot;&gt;match&lt;/span&gt;&lt;span class=&quot;token&quot;&gt; &lt;/span&gt;&lt;span class=&quot;token&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #24292e;&quot;&gt;$&lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #24292e;&quot;&gt;isInline&lt;/span&gt;&lt;span class=&quot;token&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token&quot;&gt; &lt;/span&gt;&lt;span class=&quot;token&quot;&gt;{&lt;/span&gt;&lt;span class=&quot;token&quot;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;token&quot;&gt;            &lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #005cc5;&quot;&gt;true&lt;/span&gt;&lt;span class=&quot;token&quot;&gt; &lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #d73a49;&quot;&gt;=&amp;gt;&lt;/span&gt;&lt;span class=&quot;token&quot;&gt; &lt;/span&gt;&lt;span class=&quot;token&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;token&quot;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;token&quot;&gt;                &lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #032f62;&quot;&gt;&amp;#039;&lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #032f62;&quot;&gt;fi-inline&lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #032f62;&quot;&gt;&amp;#039;&lt;/span&gt;&lt;span class=&quot;token&quot;&gt;,&lt;/span&gt;&lt;span class=&quot;token&quot;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;token&quot;&gt;            &lt;/span&gt;&lt;span class=&quot;token&quot;&gt;]&lt;/span&gt;&lt;span class=&quot;token&quot;&gt;,&lt;/span&gt;&lt;span class=&quot;token&quot;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;token&quot;&gt;            &lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #005cc5;&quot;&gt;false&lt;/span&gt;&lt;span class=&quot;token&quot;&gt; &lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #d73a49;&quot;&gt;=&amp;gt;&lt;/span&gt;&lt;span class=&quot;token&quot;&gt; &lt;/span&gt;&lt;span class=&quot;token&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;token&quot;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;token&quot;&gt;                &lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #032f62;&quot;&gt;&amp;#039;&lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #032f62;&quot;&gt;max-w-sm rounded-xl bg-white shadow-lg ring-1 dark:bg-gray-900&lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #032f62;&quot;&gt;&amp;#039;&lt;/span&gt;&lt;span class=&quot;token&quot;&gt;,&lt;/span&gt;&lt;span class=&quot;token&quot;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;token&quot;&gt;                &lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #d73a49;&quot;&gt;match&lt;/span&gt;&lt;span class=&quot;token&quot;&gt; &lt;/span&gt;&lt;span class=&quot;token&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #24292e;&quot;&gt;$&lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #24292e;&quot;&gt;color&lt;/span&gt;&lt;span class=&quot;token&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token&quot;&gt; &lt;/span&gt;&lt;span class=&quot;token&quot;&gt;{&lt;/span&gt;&lt;span class=&quot;token&quot;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;token&quot;&gt;                    &lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #032f62;&quot;&gt;&amp;#039;&lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #032f62;&quot;&gt;gray&lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #032f62;&quot;&gt;&amp;#039;&lt;/span&gt;&lt;span class=&quot;token&quot;&gt; &lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #d73a49;&quot;&gt;=&amp;gt;&lt;/span&gt;&lt;span class=&quot;token&quot;&gt; &lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #032f62;&quot;&gt;&amp;#039;&lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #032f62;&quot;&gt;ring-gray-950/5 dark:ring-white/10&lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #032f62;&quot;&gt;&amp;#039;&lt;/span&gt;&lt;span class=&quot;token&quot;&gt;,&lt;/span&gt;&lt;span class=&quot;token&quot;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;token&quot;&gt;                    &lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #d73a49;&quot;&gt;default&lt;/span&gt;&lt;span class=&quot;token&quot;&gt; &lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #d73a49;&quot;&gt;=&amp;gt;&lt;/span&gt;&lt;span class=&quot;token&quot;&gt; &lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #032f62;&quot;&gt;&amp;#039;&lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #032f62;&quot;&gt;fi-color-custom ring-custom-600/20 dark:ring-custom-400/30&lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #032f62;&quot;&gt;&amp;#039;&lt;/span&gt;&lt;span class=&quot;token&quot;&gt;,&lt;/span&gt;&lt;span class=&quot;token&quot;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;token&quot;&gt;                &lt;/span&gt;&lt;span class=&quot;token&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;token&quot;&gt;,&lt;/span&gt;&lt;span class=&quot;token&quot;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;token&quot;&gt;                &lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #005cc5;&quot;&gt;is_string&lt;/span&gt;&lt;span class=&quot;token&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #24292e;&quot;&gt;$&lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #24292e;&quot;&gt;color&lt;/span&gt;&lt;span class=&quot;token&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token&quot;&gt; &lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #d73a49;&quot;&gt;?&lt;/span&gt;&lt;span class=&quot;token&quot;&gt; &lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #032f62;&quot;&gt;&amp;#039;&lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #032f62;&quot;&gt;fi-color-&lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #032f62;&quot;&gt;&amp;#039;&lt;/span&gt;&lt;span class=&quot;token&quot;&gt; &lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #d73a49;&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token&quot;&gt; &lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #24292e;&quot;&gt;$&lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #24292e;&quot;&gt;color&lt;/span&gt;&lt;span class=&quot;token&quot;&gt; &lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #d73a49;&quot;&gt;:&lt;/span&gt;&lt;span class=&quot;token&quot;&gt; &lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #005cc5;&quot;&gt;null&lt;/span&gt;&lt;span class=&quot;token&quot;&gt;,&lt;/span&gt;&lt;span class=&quot;token&quot;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;token&quot;&gt;                &lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #032f62;&quot;&gt;&amp;#039;&lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #032f62;&quot;&gt;fi-status-&lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #032f62;&quot;&gt;&amp;#039;&lt;/span&gt;&lt;span class=&quot;token&quot;&gt; &lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #d73a49;&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token&quot;&gt; &lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #24292e;&quot;&gt;$&lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #24292e;&quot;&gt;status&lt;/span&gt;&lt;span class=&quot;token&quot;&gt; &lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #d73a49;&quot;&gt;=&amp;gt;&lt;/span&gt;&lt;span class=&quot;token&quot;&gt; &lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #24292e;&quot;&gt;$&lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #24292e;&quot;&gt;status&lt;/span&gt;&lt;span class=&quot;token&quot;&gt;,&lt;/span&gt;&lt;span class=&quot;token&quot;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;token&quot;&gt;            &lt;/span&gt;&lt;span class=&quot;token&quot;&gt;]&lt;/span&gt;&lt;span class=&quot;token&quot;&gt;,&lt;/span&gt;&lt;span class=&quot;token&quot;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;token&quot;&gt;        &lt;/span&gt;&lt;span class=&quot;token&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;token&quot;&gt;,&lt;/span&gt;&lt;span class=&quot;token&quot;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;token&quot;&gt;    &lt;/span&gt;&lt;span class=&quot;token&quot;&gt;]&lt;/span&gt;&lt;span class=&quot;token&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token&quot;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;token&quot;&gt;    &lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #d73a49;&quot;&gt;@&lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #6f42c1;&quot;&gt;style&lt;/span&gt;&lt;span class=&quot;token&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;token&quot;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;token&quot;&gt;        &lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #005cc5;&quot;&gt;\&lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #005cc5;&quot;&gt;Filament&lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #005cc5;&quot;&gt;\&lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #005cc5;&quot;&gt;Support&lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #005cc5;&quot;&gt;\&lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #6f42c1;&quot;&gt;get_color_css_variables&lt;/span&gt;&lt;span class=&quot;token&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token&quot;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;token&quot;&gt;            &lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #24292e;&quot;&gt;$&lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #24292e;&quot;&gt;color&lt;/span&gt;&lt;span class=&quot;token&quot;&gt;,&lt;/span&gt;&lt;span class=&quot;token&quot;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;token&quot;&gt;            &lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #6f42c1;&quot;&gt;shades&lt;/span&gt;&lt;span class=&quot;token&quot;&gt;:&lt;/span&gt;&lt;span class=&quot;token&quot;&gt; &lt;/span&gt;&lt;span class=&quot;token&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #005cc5;&quot;&gt;50&lt;/span&gt;&lt;span class=&quot;token&quot;&gt;,&lt;/span&gt;&lt;span class=&quot;token&quot;&gt; &lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #005cc5;&quot;&gt;400&lt;/span&gt;&lt;span class=&quot;token&quot;&gt;,&lt;/span&gt;&lt;span class=&quot;token&quot;&gt; &lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #005cc5;&quot;&gt;600&lt;/span&gt;&lt;span class=&quot;token&quot;&gt;]&lt;/span&gt;&lt;span class=&quot;token&quot;&gt;,&lt;/span&gt;&lt;span class=&quot;token&quot;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;token&quot;&gt;            &lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #6f42c1;&quot;&gt;alias&lt;/span&gt;&lt;span class=&quot;token&quot;&gt;:&lt;/span&gt;&lt;span class=&quot;token&quot;&gt; &lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #032f62;&quot;&gt;&amp;#039;&lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #032f62;&quot;&gt;notifications::notification&lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #032f62;&quot;&gt;&amp;#039;&lt;/span&gt;&lt;span class=&quot;token&quot;&gt;,&lt;/span&gt;&lt;span class=&quot;token&quot;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;token&quot;&gt;        &lt;/span&gt;&lt;span class=&quot;token&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token&quot;&gt; &lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #d73a49;&quot;&gt;=&amp;gt;&lt;/span&gt;&lt;span class=&quot;token&quot;&gt; &lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #d73a49;&quot;&gt;!&lt;/span&gt;&lt;span class=&quot;token&quot;&gt; &lt;/span&gt;&lt;span class=&quot;token&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #24292e;&quot;&gt;$&lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #24292e;&quot;&gt;isInline&lt;/span&gt;&lt;span class=&quot;token&quot;&gt; &lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #d73a49;&quot;&gt;||&lt;/span&gt;&lt;span class=&quot;token&quot;&gt; &lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #24292e;&quot;&gt;$&lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #24292e;&quot;&gt;color&lt;/span&gt;&lt;span class=&quot;token&quot;&gt; &lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #d73a49;&quot;&gt;===&lt;/span&gt;&lt;span class=&quot;token&quot;&gt; &lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #032f62;&quot;&gt;&amp;#039;&lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #032f62;&quot;&gt;gray&lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #032f62;&quot;&gt;&amp;#039;&lt;/span&gt;&lt;span class=&quot;token&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token&quot;&gt;,&lt;/span&gt;&lt;span class=&quot;token&quot;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;token&quot;&gt;    &lt;/span&gt;&lt;span class=&quot;token&quot;&gt;]&lt;/span&gt;&lt;span class=&quot;token&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token&quot;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;token&quot; style=&quot;color: #d73a49;&quot;&gt;&amp;gt;&lt;/span&gt;&lt;span class=&quot;token&quot;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;token&quot;&gt;    &lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #d73a49;&quot;&gt;&amp;lt;&lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #005cc5;&quot;&gt;div&lt;/span&gt;&lt;span class=&quot;token&quot;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;token&quot;&gt;        &lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #d73a49;&quot;&gt;@&lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #d73a49;&quot;&gt;class&lt;/span&gt;&lt;span class=&quot;token&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;token&quot;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;token&quot;&gt;            &lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #032f62;&quot;&gt;&amp;#039;&lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #032f62;&quot;&gt;flex w-full gap-3 p-4&lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #032f62;&quot;&gt;&amp;#039;&lt;/span&gt;&lt;span class=&quot;token&quot;&gt;,&lt;/span&gt;&lt;span class=&quot;token&quot;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;token&quot;&gt;            &lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #d73a49;&quot;&gt;match&lt;/span&gt;&lt;span class=&quot;token&quot;&gt; &lt;/span&gt;&lt;span class=&quot;token&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #24292e;&quot;&gt;$&lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #24292e;&quot;&gt;color&lt;/span&gt;&lt;span class=&quot;token&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token&quot;&gt; &lt;/span&gt;&lt;span class=&quot;token&quot;&gt;{&lt;/span&gt;&lt;span class=&quot;token&quot;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;token&quot;&gt;                &lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #032f62;&quot;&gt;&amp;#039;&lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #032f62;&quot;&gt;gray&lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #032f62;&quot;&gt;&amp;#039;&lt;/span&gt;&lt;span class=&quot;token&quot;&gt; &lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #d73a49;&quot;&gt;=&amp;gt;&lt;/span&gt;&lt;span class=&quot;token&quot;&gt; &lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #005cc5;&quot;&gt;null&lt;/span&gt;&lt;span class=&quot;token&quot;&gt;,&lt;/span&gt;&lt;span class=&quot;token&quot;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;token&quot;&gt;                &lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #d73a49;&quot;&gt;default&lt;/span&gt;&lt;span class=&quot;token&quot;&gt; &lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #d73a49;&quot;&gt;=&amp;gt;&lt;/span&gt;&lt;span class=&quot;token&quot;&gt; &lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #032f62;&quot;&gt;&amp;#039;&lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #032f62;&quot;&gt;bg-custom-50 dark:bg-custom-400/10&lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #032f62;&quot;&gt;&amp;#039;&lt;/span&gt;&lt;span class=&quot;token&quot;&gt;,&lt;/span&gt;&lt;span class=&quot;token&quot;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;token&quot;&gt;            &lt;/span&gt;&lt;span class=&quot;token&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;token&quot;&gt;,&lt;/span&gt;&lt;span class=&quot;token&quot;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;token&quot;&gt;        &lt;/span&gt;&lt;span class=&quot;token&quot;&gt;]&lt;/span&gt;&lt;span class=&quot;token&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token&quot;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;token&quot;&gt;    &lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #d73a49;&quot;&gt;&amp;gt;&lt;/span&gt;&lt;span class=&quot;token&quot;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;token&quot;&gt;        &lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #d73a49;&quot;&gt;@&lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #d73a49;&quot;&gt;if&lt;/span&gt;&lt;span class=&quot;token&quot;&gt; &lt;/span&gt;&lt;span class=&quot;token&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #24292e;&quot;&gt;$&lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #24292e;&quot;&gt;icon&lt;/span&gt;&lt;span class=&quot;token&quot;&gt; &lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #d73a49;&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;token&quot;&gt; &lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #24292e;&quot;&gt;$&lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #24292e;&quot;&gt;getIcon&lt;/span&gt;&lt;span class=&quot;token&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token&quot;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;token&quot;&gt;            &lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #d73a49;&quot;&gt;&amp;lt;&lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #005cc5;&quot;&gt;x&lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #d73a49;&quot;&gt;-&lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #005cc5;&quot;&gt;filament&lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #d73a49;&quot;&gt;-&lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #005cc5;&quot;&gt;notifications&lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #d73a49;&quot;&gt;::&lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #005cc5;&quot;&gt;icon&lt;/span&gt;&lt;span class=&quot;token&quot;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;token&quot;&gt;                &lt;/span&gt;&lt;span class=&quot;token&quot;&gt;:&lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #005cc5;&quot;&gt;color&lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #d73a49;&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #032f62;&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #032f62;&quot;&gt;$&lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #24292e;&quot;&gt;getIconColor&lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #032f62;&quot;&gt;()&lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #032f62;&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span class=&quot;token&quot;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;token&quot;&gt;                &lt;/span&gt;&lt;span class=&quot;token&quot;&gt;:&lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #005cc5;&quot;&gt;icon&lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #d73a49;&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #032f62;&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #032f62;&quot;&gt;$&lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #24292e;&quot;&gt;icon&lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #032f62;&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span class=&quot;token&quot;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;token&quot;&gt;                &lt;/span&gt;&lt;span class=&quot;token&quot;&gt;:&lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #005cc5;&quot;&gt;size&lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #d73a49;&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #032f62;&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #032f62;&quot;&gt;$&lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #24292e;&quot;&gt;getIconSize&lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #032f62;&quot;&gt;()&lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #032f62;&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span class=&quot;token&quot;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;token&quot;&gt;            &lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #d73a49;&quot;&gt;/&lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #d73a49;&quot;&gt;&amp;gt;&lt;/span&gt;&lt;span class=&quot;token&quot;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;token&quot;&gt;        &lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #d73a49;&quot;&gt;@&lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #d73a49;&quot;&gt;endif&lt;/span&gt;&lt;span class=&quot;token&quot;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;token&quot;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;token&quot;&gt;        &lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #d73a49;&quot;&gt;&amp;lt;&lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #005cc5;&quot;&gt;div&lt;/span&gt;&lt;span class=&quot;token&quot;&gt; &lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #d73a49;&quot;&gt;class&lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #d73a49;&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #032f62;&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #032f62;&quot;&gt;mt-0.5 grid flex-1&lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #032f62;&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #d73a49;&quot;&gt;&amp;gt;&lt;/span&gt;&lt;span class=&quot;token&quot;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;token&quot;&gt;                  
&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;token&quot;&gt;            &lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #d73a49;&quot;&gt;@&lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #d73a49;&quot;&gt;if&lt;/span&gt;&lt;span class=&quot;token&quot;&gt; &lt;/span&gt;&lt;span class=&quot;token&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #24292e;&quot;&gt;$&lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #24292e;&quot;&gt;hasTitle&lt;/span&gt;&lt;span class=&quot;token&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token&quot;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;token&quot;&gt;                &lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #d73a49;&quot;&gt;&amp;lt;&lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #005cc5;&quot;&gt;x&lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #d73a49;&quot;&gt;-&lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #005cc5;&quot;&gt;filament&lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #d73a49;&quot;&gt;-&lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #005cc5;&quot;&gt;notifications&lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #d73a49;&quot;&gt;::&lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #005cc5;&quot;&gt;title&lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #d73a49;&quot;&gt;&amp;gt;&lt;/span&gt;&lt;span class=&quot;token&quot;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;token&quot;&gt;                    &lt;/span&gt;&lt;span class=&quot;token&quot;&gt;{&lt;/span&gt;&lt;span class=&quot;token&quot;&gt;{&lt;/span&gt;&lt;span class=&quot;token&quot;&gt; &lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #6f42c1;&quot;&gt;str&lt;/span&gt;&lt;span class=&quot;token&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #24292e;&quot;&gt;$&lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #24292e;&quot;&gt;title&lt;/span&gt;&lt;span class=&quot;token&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #d73a49;&quot;&gt;-&amp;gt;&lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #6f42c1;&quot;&gt;sanitizeHtml&lt;/span&gt;&lt;span class=&quot;token&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #d73a49;&quot;&gt;-&amp;gt;&lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #6f42c1;&quot;&gt;toHtmlString&lt;/span&gt;&lt;span class=&quot;token&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token&quot;&gt; &lt;/span&gt;&lt;span class=&quot;token&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;token&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;token&quot;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;token&quot;&gt;                &lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #d73a49;&quot;&gt;&amp;lt;&lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #d73a49;&quot;&gt;/&lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #005cc5;&quot;&gt;x&lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #d73a49;&quot;&gt;-&lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #005cc5;&quot;&gt;filament&lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #d73a49;&quot;&gt;-&lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #005cc5;&quot;&gt;notifications&lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #d73a49;&quot;&gt;::&lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #005cc5;&quot;&gt;title&lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #d73a49;&quot;&gt;&amp;gt;&lt;/span&gt;&lt;span class=&quot;token&quot;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;token&quot;&gt;            &lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #d73a49;&quot;&gt;@&lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #d73a49;&quot;&gt;endif&lt;/span&gt;&lt;span class=&quot;token&quot;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;token&quot;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;token&quot;&gt;            &lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #d73a49;&quot;&gt;@&lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #d73a49;&quot;&gt;if&lt;/span&gt;&lt;span class=&quot;token&quot;&gt; &lt;/span&gt;&lt;span class=&quot;token&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #24292e;&quot;&gt;$&lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #24292e;&quot;&gt;hasDate&lt;/span&gt;&lt;span class=&quot;token&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token&quot;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;token&quot;&gt;                &lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #d73a49;&quot;&gt;&amp;lt;&lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #005cc5;&quot;&gt;x&lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #d73a49;&quot;&gt;-&lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #005cc5;&quot;&gt;filament&lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #d73a49;&quot;&gt;-&lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #005cc5;&quot;&gt;notifications&lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #d73a49;&quot;&gt;::&lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #005cc5;&quot;&gt;date&lt;/span&gt;&lt;span class=&quot;token&quot;&gt; &lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #d73a49;&quot;&gt;@&lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #d73a49;&quot;&gt;class&lt;/span&gt;&lt;span class=&quot;token&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #032f62;&quot;&gt;&amp;#039;&lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #032f62;&quot;&gt;mt-1&lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #032f62;&quot;&gt;&amp;#039;&lt;/span&gt;&lt;span class=&quot;token&quot;&gt; &lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #d73a49;&quot;&gt;=&amp;gt;&lt;/span&gt;&lt;span class=&quot;token&quot;&gt; &lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #24292e;&quot;&gt;$&lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #24292e;&quot;&gt;hasTitle&lt;/span&gt;&lt;span class=&quot;token&quot;&gt;]&lt;/span&gt;&lt;span class=&quot;token&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #d73a49;&quot;&gt;&amp;gt;&lt;/span&gt;&lt;span class=&quot;token&quot;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;token&quot;&gt;                    &lt;/span&gt;&lt;span class=&quot;token&quot;&gt;{&lt;/span&gt;&lt;span class=&quot;token&quot;&gt;{&lt;/span&gt;&lt;span class=&quot;token&quot;&gt; &lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #24292e;&quot;&gt;$&lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #24292e;&quot;&gt;date&lt;/span&gt;&lt;span class=&quot;token&quot;&gt; &lt;/span&gt;&lt;span class=&quot;token&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;token&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;token&quot;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;token&quot;&gt;                &lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #d73a49;&quot;&gt;&amp;lt;&lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #d73a49;&quot;&gt;/&lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #005cc5;&quot;&gt;x&lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #d73a49;&quot;&gt;-&lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #005cc5;&quot;&gt;filament&lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #d73a49;&quot;&gt;-&lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #005cc5;&quot;&gt;notifications&lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #d73a49;&quot;&gt;::&lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #005cc5;&quot;&gt;date&lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #d73a49;&quot;&gt;&amp;gt;&lt;/span&gt;&lt;span class=&quot;token&quot;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;token&quot;&gt;            &lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #d73a49;&quot;&gt;@&lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #d73a49;&quot;&gt;endif&lt;/span&gt;&lt;span class=&quot;token&quot;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;token&quot; style=&quot;color: #d73a49;&quot;&gt;@&lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #d73a49;&quot;&gt;if&lt;/span&gt;&lt;span class=&quot;token&quot;&gt; &lt;/span&gt;&lt;span class=&quot;token&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #24292e;&quot;&gt;$&lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #24292e;&quot;&gt;hasBody&lt;/span&gt;&lt;span class=&quot;token&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token&quot;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;token&quot;&gt;    &lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #d73a49;&quot;&gt;&amp;lt;&lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #005cc5;&quot;&gt;x&lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #d73a49;&quot;&gt;-&lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #005cc5;&quot;&gt;filament&lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #d73a49;&quot;&gt;-&lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #005cc5;&quot;&gt;notifications&lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #d73a49;&quot;&gt;::&lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #005cc5;&quot;&gt;body&lt;/span&gt;&lt;span class=&quot;token&quot;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;token&quot;&gt;        &lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #d73a49;&quot;&gt;@&lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #d73a49;&quot;&gt;class&lt;/span&gt;&lt;span class=&quot;token&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #032f62;&quot;&gt;&amp;#039;&lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #032f62;&quot;&gt;mt-1&lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #032f62;&quot;&gt;&amp;#039;&lt;/span&gt;&lt;span class=&quot;token&quot;&gt; &lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #d73a49;&quot;&gt;=&amp;gt;&lt;/span&gt;&lt;span class=&quot;token&quot;&gt; &lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #24292e;&quot;&gt;$&lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #24292e;&quot;&gt;hasTitle&lt;/span&gt;&lt;span class=&quot;token&quot;&gt; &lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #d73a49;&quot;&gt;||&lt;/span&gt;&lt;span class=&quot;token&quot;&gt; &lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #24292e;&quot;&gt;$&lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #24292e;&quot;&gt;hasDate&lt;/span&gt;&lt;span class=&quot;token&quot;&gt;]&lt;/span&gt;&lt;span class=&quot;token&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token&quot;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;token&quot;&gt;    &lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #d73a49;&quot;&gt;&amp;gt;&lt;/span&gt;&lt;span class=&quot;token&quot;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;token&quot;&gt;            &lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #d73a49;&quot;&gt;&amp;lt;&lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #005cc5;&quot;&gt;div&lt;/span&gt;&lt;span class=&quot;token&quot;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;token&quot;&gt;                &lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #005cc5;&quot;&gt;x&lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #d73a49;&quot;&gt;-&lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #005cc5;&quot;&gt;data&lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #d73a49;&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #032f62;&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #032f62;&quot;&gt;{body: @js(str(&lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #032f62;&quot;&gt;$&lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #24292e;&quot;&gt;body&lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #032f62;&quot;&gt;)-&amp;gt;sanitizeHtml()-&amp;gt;toString() )}&lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #032f62;&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span class=&quot;token&quot;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;token&quot;&gt;                &lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #005cc5;&quot;&gt;x&lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #d73a49;&quot;&gt;-&lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #005cc5;&quot;&gt;html&lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #d73a49;&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #032f62;&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #032f62;&quot;&gt;body&lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #032f62;&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span class=&quot;token&quot;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;token&quot;&gt;                &lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #005cc5;&quot;&gt;x&lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #d73a49;&quot;&gt;-&lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #005cc5;&quot;&gt;init&lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #d73a49;&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #032f62;&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #032f62;&quot;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;token&quot; style=&quot;color: #032f62;&quot;&gt;                Echo.private(&amp;#039;App.Models.User.{{ auth()-&amp;gt;user()-&amp;gt;id }}&amp;#039;).listen(&amp;#039;.UpdateNotificationBody&amp;#039;, (event) =&amp;gt; { if (event.id == &amp;#039;{&lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #032f62;&quot;&gt;{&lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #24292e;&quot;&gt;$&lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #24292e;&quot;&gt;notification&lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #d73a49;&quot;&gt;-&amp;gt;&lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #6f42c1;&quot;&gt;getId&lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #032f62;&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #032f62;&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #032f62;&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #032f62;&quot;&gt;}&amp;#039;) body = event.body });
&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;token&quot; style=&quot;color: #032f62;&quot;&gt;                Echo.private(&amp;#039;App.Models.User.{{ auth()-&amp;gt;user()-&amp;gt;id }}&amp;#039;).listen(&amp;#039;.CloseNotification&amp;#039;, (event) =&amp;gt; { if (event.id == &amp;#039;{&lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #032f62;&quot;&gt;{&lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #24292e;&quot;&gt;$&lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #24292e;&quot;&gt;notification&lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #d73a49;&quot;&gt;-&amp;gt;&lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #6f42c1;&quot;&gt;getId&lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #032f62;&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #032f62;&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #032f62;&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #032f62;&quot;&gt;}&amp;#039;) setTimeout(() =&amp;gt; &lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #032f62;&quot;&gt;$&lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #24292e;&quot;&gt;dispatch&lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #032f62;&quot;&gt;(&amp;#039;close-notification&amp;#039;, {id: event.id}), 2000); });
&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;token&quot; style=&quot;color: #032f62;&quot;&gt;                &lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #032f62;&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span class=&quot;token&quot;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;token&quot;&gt;            &lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #d73a49;&quot;&gt;&amp;gt;&lt;/span&gt;&lt;span class=&quot;token&quot;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;token&quot;&gt;                &lt;/span&gt;&lt;span class=&quot;token&quot;&gt;{&lt;/span&gt;&lt;span class=&quot;token&quot;&gt;{&lt;/span&gt;&lt;span class=&quot;token&quot;&gt; &lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #6f42c1;&quot;&gt;str&lt;/span&gt;&lt;span class=&quot;token&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #24292e;&quot;&gt;$&lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #24292e;&quot;&gt;body&lt;/span&gt;&lt;span class=&quot;token&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #d73a49;&quot;&gt;-&amp;gt;&lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #6f42c1;&quot;&gt;sanitizeHtml&lt;/span&gt;&lt;span class=&quot;token&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #d73a49;&quot;&gt;-&amp;gt;&lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #6f42c1;&quot;&gt;toHtmlString&lt;/span&gt;&lt;span class=&quot;token&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token&quot;&gt; &lt;/span&gt;&lt;span class=&quot;token&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;token&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;token&quot;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;token&quot;&gt;            &lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #d73a49;&quot;&gt;&amp;lt;&lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #d73a49;&quot;&gt;/&lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #005cc5;&quot;&gt;div&lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #d73a49;&quot;&gt;&amp;gt;&lt;/span&gt;&lt;span class=&quot;token&quot;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;token&quot;&gt;    &lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #d73a49;&quot;&gt;&amp;lt;&lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #d73a49;&quot;&gt;/&lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #005cc5;&quot;&gt;x&lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #d73a49;&quot;&gt;-&lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #005cc5;&quot;&gt;filament&lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #d73a49;&quot;&gt;-&lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #005cc5;&quot;&gt;notifications&lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #d73a49;&quot;&gt;::&lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #005cc5;&quot;&gt;body&lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #d73a49;&quot;&gt;&amp;gt;&lt;/span&gt;&lt;span class=&quot;token&quot;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;token&quot; style=&quot;color: #d73a49;&quot;&gt;@&lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #d73a49;&quot;&gt;endif&lt;/span&gt;&lt;span class=&quot;token&quot;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;token&quot;&gt;            &lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #d73a49;&quot;&gt;@&lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #d73a49;&quot;&gt;if&lt;/span&gt;&lt;span class=&quot;token&quot;&gt; &lt;/span&gt;&lt;span class=&quot;token&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #24292e;&quot;&gt;$&lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #24292e;&quot;&gt;actions&lt;/span&gt;&lt;span class=&quot;token&quot;&gt; &lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #d73a49;&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;token&quot;&gt; &lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #24292e;&quot;&gt;$&lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #24292e;&quot;&gt;getActions&lt;/span&gt;&lt;span class=&quot;token&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token&quot;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;token&quot;&gt;                &lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #d73a49;&quot;&gt;&amp;lt;&lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #005cc5;&quot;&gt;x&lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #d73a49;&quot;&gt;-&lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #005cc5;&quot;&gt;filament&lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #d73a49;&quot;&gt;-&lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #005cc5;&quot;&gt;notifications&lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #d73a49;&quot;&gt;::&lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #005cc5;&quot;&gt;actions&lt;/span&gt;&lt;span class=&quot;token&quot;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;token&quot;&gt;                    &lt;/span&gt;&lt;span class=&quot;token&quot;&gt;:&lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #005cc5;&quot;&gt;actions&lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #d73a49;&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #032f62;&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #032f62;&quot;&gt;$&lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #24292e;&quot;&gt;actions&lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #032f62;&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span class=&quot;token&quot;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;token&quot;&gt;                    &lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #d73a49;&quot;&gt;@&lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #d73a49;&quot;&gt;class&lt;/span&gt;&lt;span class=&quot;token&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #032f62;&quot;&gt;&amp;#039;&lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #032f62;&quot;&gt;mt-3&lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #032f62;&quot;&gt;&amp;#039;&lt;/span&gt;&lt;span class=&quot;token&quot;&gt; &lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #d73a49;&quot;&gt;=&amp;gt;&lt;/span&gt;&lt;span class=&quot;token&quot;&gt; &lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #24292e;&quot;&gt;$&lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #24292e;&quot;&gt;hasTitle&lt;/span&gt;&lt;span class=&quot;token&quot;&gt; &lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #d73a49;&quot;&gt;||&lt;/span&gt;&lt;span class=&quot;token&quot;&gt; &lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #24292e;&quot;&gt;$&lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #24292e;&quot;&gt;hasDate&lt;/span&gt;&lt;span class=&quot;token&quot;&gt; &lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #d73a49;&quot;&gt;||&lt;/span&gt;&lt;span class=&quot;token&quot;&gt; &lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #24292e;&quot;&gt;$&lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #24292e;&quot;&gt;hasBody&lt;/span&gt;&lt;span class=&quot;token&quot;&gt;]&lt;/span&gt;&lt;span class=&quot;token&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token&quot;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;token&quot;&gt;                &lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #d73a49;&quot;&gt;/&lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #d73a49;&quot;&gt;&amp;gt;&lt;/span&gt;&lt;span class=&quot;token&quot;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;token&quot;&gt;            &lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #d73a49;&quot;&gt;@&lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #d73a49;&quot;&gt;endif&lt;/span&gt;&lt;span class=&quot;token&quot;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;token&quot;&gt;        &lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #d73a49;&quot;&gt;&amp;lt;&lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #d73a49;&quot;&gt;/&lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #005cc5;&quot;&gt;div&lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #d73a49;&quot;&gt;&amp;gt;&lt;/span&gt;&lt;span class=&quot;token&quot;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;token&quot;&gt;                      
&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;token&quot;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;token&quot;&gt;        &lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #d73a49;&quot;&gt;&amp;lt;&lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #005cc5;&quot;&gt;x&lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #d73a49;&quot;&gt;-&lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #005cc5;&quot;&gt;filament&lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #d73a49;&quot;&gt;-&lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #005cc5;&quot;&gt;notifications&lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #d73a49;&quot;&gt;::&lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #005cc5;&quot;&gt;close&lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #d73a49;&quot;&gt;-&lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #005cc5;&quot;&gt;button&lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #d73a49;&quot;&gt;/&lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #d73a49;&quot;&gt;&amp;gt;&lt;/span&gt;&lt;span class=&quot;token&quot;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;token&quot;&gt;    &lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #d73a49;&quot;&gt;&amp;lt;&lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #d73a49;&quot;&gt;/&lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #005cc5;&quot;&gt;div&lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #d73a49;&quot;&gt;&amp;gt;&lt;/span&gt;&lt;span class=&quot;token&quot;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;token&quot; style=&quot;color: #d73a49;&quot;&gt;&amp;lt;&lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #d73a49;&quot;&gt;/&lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #005cc5;&quot;&gt;x&lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #d73a49;&quot;&gt;-&lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #005cc5;&quot;&gt;filament&lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #d73a49;&quot;&gt;-&lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #005cc5;&quot;&gt;notifications&lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #d73a49;&quot;&gt;::&lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #005cc5;&quot;&gt;notification&lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #d73a49;&quot;&gt;&amp;gt;&lt;/span&gt;&lt;span class=&quot;token&quot;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;Here we basically added an alpine component that listent to two events:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;UpdateNotificationBody&lt;/code&gt; for updating a notification&lt;/li&gt;
&lt;li&gt;&lt;code&gt;CloseNotification&lt;/code&gt; for closing the notification when progress == 100%&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;&lt;a id=&quot;content-create-a-new-helper-class-&quot; href=&quot;#content-create-a-new-helper-class-&quot; class=&quot;heading-permalink&quot; aria-hidden=&quot;true&quot; tabindex=&quot;-1&quot; title=&quot;Permalink&quot;&gt;#&lt;/a&gt;Create a new helper class 🎨&lt;/h3&gt;
&lt;p&gt;Put it wherever you want. If you read the code, it's self-explanatory.&lt;/p&gt;
&lt;p&gt;I made the API simple enough so my users will experience the same notification throughout the project, but you can expand it if necessary. The end success notification is a bit more customizable.&lt;/p&gt;
&lt;div x-data=&quot;codeBlock&quot; class=&quot;code-block relative&quot;&gt;&lt;div class=&quot;flex space-x-2 items-center absolute top-0 right-0&quot;&gt;
    &lt;div x-cloak x-show=&quot;showMessage&quot; x-transition class=&quot;py-2 animate-bounce transition duration-300 mt-1 text-sky-500 text-xs&quot;&gt;Copied!&lt;/div&gt;
    &lt;button
        type=&quot;button&quot;
        title=&quot;Copy to clipboard&quot;
        class=&quot;hidden sm:block p-2 pl-3 transition duration-300&quot;
        @click.prevent=&quot;copyToClipboard&quot;
        :class=&quot;{
            'text-black/30 hover:text-black/80': !showMessage,
            'text-sky-500 hover:text-sky-700': showMessage,
        }&quot;&gt;
        &lt;svg xmlns=&quot;http://www.w3.org/2000/svg&quot; fill=&quot;none&quot; viewBox=&quot;0 0 24 24&quot; stroke-width=&quot;1.5&quot; stroke=&quot;currentColor&quot; class=&quot;block w-6 h-6&quot;&gt;
            &lt;path fill=&quot;white&quot; stroke-linecap=&quot;round&quot; stroke-linejoin=&quot;round&quot; d=&quot;M11.35 3.836c-.065.21-.1.433-.1.664 0 .414.336.75.75.75h4.5a.75.75 0 00.75-.75 2.25 2.25 0 00-.1-.664m-5.8 0A2.251 2.251 0 0113.5 2.25H15c1.012 0 1.867.668 2.15 1.586m-5.8 0c-.376.023-.75.05-1.124.08C9.095 4.01 8.25 4.973 8.25 6.108V8.25m8.9-4.414c.376.023.75.05 1.124.08 1.131.094 1.976 1.057 1.976 2.192V16.5A2.25 2.25 0 0118 18.75h-2.25m-7.5-10.5H4.875c-.621 0-1.125.504-1.125 1.125v11.25c0 .621.504 1.125 1.125 1.125h9.75c.621 0 1.125-.504 1.125-1.125V18.75m-7.5-10.5h6.375c.621 0 1.125.504 1.125 1.125v9.375m-8.25-3l1.5 1.5 3-3.75&quot; /&gt;
        &lt;/svg&gt;
    &lt;/button&gt;
&lt;/div&gt;&lt;pre class=&quot;phiki language-php github-light&quot; data-language=&quot;php&quot; style=&quot;background-color: #fff;color: #24292e;&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;token&quot; style=&quot;color: #d73a49;&quot;&gt;&amp;lt;&lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #d73a49;&quot;&gt;?&lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #005cc5;&quot;&gt;php&lt;/span&gt;&lt;span class=&quot;token&quot;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;token&quot;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;token&quot; style=&quot;color: #d73a49;&quot;&gt;namespace&lt;/span&gt;&lt;span class=&quot;token&quot;&gt; &lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #6f42c1;&quot;&gt;App&lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #6f42c1;&quot;&gt;\&lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #6f42c1;&quot;&gt;Services&lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #6f42c1;&quot;&gt;\&lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #6f42c1;&quot;&gt;BackgroundTasks&lt;/span&gt;&lt;span class=&quot;token&quot;&gt;;&lt;/span&gt;&lt;span class=&quot;token&quot;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;token&quot;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;token&quot; style=&quot;color: #d73a49;&quot;&gt;use&lt;/span&gt;&lt;span class=&quot;token&quot;&gt; &lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #005cc5;&quot;&gt;App&lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #005cc5;&quot;&gt;\&lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #005cc5;&quot;&gt;Models&lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #005cc5;&quot;&gt;\&lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #005cc5;&quot;&gt;User&lt;/span&gt;&lt;span class=&quot;token&quot;&gt;;&lt;/span&gt;&lt;span class=&quot;token&quot;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;token&quot; style=&quot;color: #d73a49;&quot;&gt;use&lt;/span&gt;&lt;span class=&quot;token&quot;&gt; &lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #005cc5;&quot;&gt;Closure&lt;/span&gt;&lt;span class=&quot;token&quot;&gt;;&lt;/span&gt;&lt;span class=&quot;token&quot;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;token&quot; style=&quot;color: #d73a49;&quot;&gt;use&lt;/span&gt;&lt;span class=&quot;token&quot;&gt; &lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #005cc5;&quot;&gt;Exception&lt;/span&gt;&lt;span class=&quot;token&quot;&gt;;&lt;/span&gt;&lt;span class=&quot;token&quot;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;token&quot; style=&quot;color: #d73a49;&quot;&gt;use&lt;/span&gt;&lt;span class=&quot;token&quot;&gt; &lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #005cc5;&quot;&gt;Filament&lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #005cc5;&quot;&gt;\&lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #005cc5;&quot;&gt;Notifications&lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #005cc5;&quot;&gt;\&lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #005cc5;&quot;&gt;Notification&lt;/span&gt;&lt;span class=&quot;token&quot;&gt;;&lt;/span&gt;&lt;span class=&quot;token&quot;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;token&quot; style=&quot;color: #d73a49;&quot;&gt;use&lt;/span&gt;&lt;span class=&quot;token&quot;&gt; &lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #005cc5;&quot;&gt;Illuminate&lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #005cc5;&quot;&gt;\&lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #005cc5;&quot;&gt;Bus&lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #005cc5;&quot;&gt;\&lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #005cc5;&quot;&gt;Batch&lt;/span&gt;&lt;span class=&quot;token&quot;&gt;;&lt;/span&gt;&lt;span class=&quot;token&quot;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;token&quot; style=&quot;color: #d73a49;&quot;&gt;use&lt;/span&gt;&lt;span class=&quot;token&quot;&gt; &lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #005cc5;&quot;&gt;Illuminate&lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #005cc5;&quot;&gt;\&lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #005cc5;&quot;&gt;Bus&lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #005cc5;&quot;&gt;\&lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #005cc5;&quot;&gt;PendingBatch&lt;/span&gt;&lt;span class=&quot;token&quot;&gt;;&lt;/span&gt;&lt;span class=&quot;token&quot;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;token&quot; style=&quot;color: #d73a49;&quot;&gt;use&lt;/span&gt;&lt;span class=&quot;token&quot;&gt; &lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #005cc5;&quot;&gt;Illuminate&lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #005cc5;&quot;&gt;\&lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #005cc5;&quot;&gt;Contracts&lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #005cc5;&quot;&gt;\&lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #005cc5;&quot;&gt;Support&lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #005cc5;&quot;&gt;\&lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #005cc5;&quot;&gt;Htmlable&lt;/span&gt;&lt;span class=&quot;token&quot;&gt;;&lt;/span&gt;&lt;span class=&quot;token&quot;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;token&quot; style=&quot;color: #d73a49;&quot;&gt;use&lt;/span&gt;&lt;span class=&quot;token&quot;&gt; &lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #005cc5;&quot;&gt;Illuminate&lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #005cc5;&quot;&gt;\&lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #005cc5;&quot;&gt;Support&lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #005cc5;&quot;&gt;\&lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #005cc5;&quot;&gt;Collection&lt;/span&gt;&lt;span class=&quot;token&quot;&gt;;&lt;/span&gt;&lt;span class=&quot;token&quot;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;token&quot; style=&quot;color: #d73a49;&quot;&gt;use&lt;/span&gt;&lt;span class=&quot;token&quot;&gt; &lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #005cc5;&quot;&gt;Illuminate&lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #005cc5;&quot;&gt;\&lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #005cc5;&quot;&gt;Support&lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #005cc5;&quot;&gt;\&lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #005cc5;&quot;&gt;Facades&lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #005cc5;&quot;&gt;\&lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #005cc5;&quot;&gt;Broadcast&lt;/span&gt;&lt;span class=&quot;token&quot;&gt;;&lt;/span&gt;&lt;span class=&quot;token&quot;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;token&quot; style=&quot;color: #d73a49;&quot;&gt;use&lt;/span&gt;&lt;span class=&quot;token&quot;&gt; &lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #005cc5;&quot;&gt;Illuminate&lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #005cc5;&quot;&gt;\&lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #005cc5;&quot;&gt;Support&lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #005cc5;&quot;&gt;\&lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #005cc5;&quot;&gt;Facades&lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #005cc5;&quot;&gt;\&lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #005cc5;&quot;&gt;Bus&lt;/span&gt;&lt;span class=&quot;token&quot;&gt;;&lt;/span&gt;&lt;span class=&quot;token&quot;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;token&quot;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;token&quot; style=&quot;color: #d73a49;&quot;&gt;class&lt;/span&gt;&lt;span class=&quot;token&quot;&gt; &lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #6f42c1;&quot;&gt;BackgroundTasks&lt;/span&gt;&lt;span class=&quot;token&quot;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;token&quot;&gt;{&lt;/span&gt;&lt;span class=&quot;token&quot;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;token&quot;&gt;    &lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #d73a49;&quot;&gt;protected&lt;/span&gt;&lt;span class=&quot;token&quot;&gt; &lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #005cc5;&quot;&gt;Notification&lt;/span&gt;&lt;span class=&quot;token&quot;&gt; &lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #24292e;&quot;&gt;$&lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #24292e;&quot;&gt;notification&lt;/span&gt;&lt;span class=&quot;token&quot;&gt;;&lt;/span&gt;&lt;span class=&quot;token&quot;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;token&quot;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;token&quot;&gt;    &lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #d73a49;&quot;&gt;protected&lt;/span&gt;&lt;span class=&quot;token&quot;&gt; &lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #005cc5;&quot;&gt;PendingBatch&lt;/span&gt;&lt;span class=&quot;token&quot;&gt;|&lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #005cc5;&quot;&gt;Batch&lt;/span&gt;&lt;span class=&quot;token&quot;&gt; &lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #24292e;&quot;&gt;$&lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #24292e;&quot;&gt;batch&lt;/span&gt;&lt;span class=&quot;token&quot;&gt;;&lt;/span&gt;&lt;span class=&quot;token&quot;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;token&quot;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;token&quot;&gt;    &lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #d73a49;&quot;&gt;protected&lt;/span&gt;&lt;span class=&quot;token&quot;&gt; &lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #005cc5;&quot;&gt;User&lt;/span&gt;&lt;span class=&quot;token&quot;&gt; &lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #24292e;&quot;&gt;$&lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #24292e;&quot;&gt;user&lt;/span&gt;&lt;span class=&quot;token&quot;&gt;;&lt;/span&gt;&lt;span class=&quot;token&quot;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;token&quot;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;token&quot;&gt;    &lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #d73a49;&quot;&gt;protected&lt;/span&gt;&lt;span class=&quot;token&quot;&gt; &lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #005cc5;&quot;&gt;Notification&lt;/span&gt;&lt;span class=&quot;token&quot;&gt; &lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #24292e;&quot;&gt;$&lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #24292e;&quot;&gt;successNotification&lt;/span&gt;&lt;span class=&quot;token&quot;&gt;;&lt;/span&gt;&lt;span class=&quot;token&quot;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;token&quot;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;token&quot;&gt;    &lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #d73a49;&quot;&gt;protected&lt;/span&gt;&lt;span class=&quot;token&quot;&gt; &lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #d73a49;&quot;&gt;array&lt;/span&gt;&lt;span class=&quot;token&quot;&gt;|&lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #005cc5;&quot;&gt;Collection&lt;/span&gt;&lt;span class=&quot;token&quot;&gt; &lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #24292e;&quot;&gt;$&lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #24292e;&quot;&gt;jobs&lt;/span&gt;&lt;span class=&quot;token&quot;&gt;;&lt;/span&gt;&lt;span class=&quot;token&quot;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;token&quot;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;token&quot;&gt;    &lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #d73a49;&quot;&gt;public&lt;/span&gt;&lt;span class=&quot;token&quot;&gt; &lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #d73a49;&quot;&gt;function&lt;/span&gt;&lt;span class=&quot;token&quot;&gt; &lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #005cc5;&quot;&gt;__construct&lt;/span&gt;&lt;span class=&quot;token&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #d73a49;&quot;&gt;array&lt;/span&gt;&lt;span class=&quot;token&quot;&gt;|&lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #005cc5;&quot;&gt;Collection&lt;/span&gt;&lt;span class=&quot;token&quot;&gt; &lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #24292e;&quot;&gt;$&lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #24292e;&quot;&gt;jobs&lt;/span&gt;&lt;span class=&quot;token&quot;&gt;,&lt;/span&gt;&lt;span class=&quot;token&quot;&gt; &lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #005cc5;&quot;&gt;User&lt;/span&gt;&lt;span class=&quot;token&quot;&gt; &lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #24292e;&quot;&gt;$&lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #24292e;&quot;&gt;user&lt;/span&gt;&lt;span class=&quot;token&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token&quot;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;token&quot;&gt;    &lt;/span&gt;&lt;span class=&quot;token&quot;&gt;{&lt;/span&gt;&lt;span class=&quot;token&quot;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;token&quot;&gt;        &lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #005cc5;&quot;&gt;$&lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #005cc5;&quot;&gt;this&lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #d73a49;&quot;&gt;-&amp;gt;&lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #24292e;&quot;&gt;jobs&lt;/span&gt;&lt;span class=&quot;token&quot;&gt; &lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #d73a49;&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;token&quot;&gt; &lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #24292e;&quot;&gt;$&lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #24292e;&quot;&gt;jobs&lt;/span&gt;&lt;span class=&quot;token&quot;&gt;;&lt;/span&gt;&lt;span class=&quot;token&quot;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;token&quot;&gt;        &lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #005cc5;&quot;&gt;$&lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #005cc5;&quot;&gt;this&lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #d73a49;&quot;&gt;-&amp;gt;&lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #24292e;&quot;&gt;user&lt;/span&gt;&lt;span class=&quot;token&quot;&gt; &lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #d73a49;&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;token&quot;&gt; &lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #24292e;&quot;&gt;$&lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #24292e;&quot;&gt;user&lt;/span&gt;&lt;span class=&quot;token&quot;&gt;;&lt;/span&gt;&lt;span class=&quot;token&quot;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;token&quot;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;token&quot;&gt;        &lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #005cc5;&quot;&gt;$&lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #005cc5;&quot;&gt;this&lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #d73a49;&quot;&gt;-&amp;gt;&lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #24292e;&quot;&gt;notification&lt;/span&gt;&lt;span class=&quot;token&quot;&gt; &lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #d73a49;&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;token&quot;&gt; &lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #005cc5;&quot;&gt;Notification&lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #d73a49;&quot;&gt;::&lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #6f42c1;&quot;&gt;make&lt;/span&gt;&lt;span class=&quot;token&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token&quot;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;token&quot;&gt;            &lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #d73a49;&quot;&gt;-&amp;gt;&lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #6f42c1;&quot;&gt;body&lt;/span&gt;&lt;span class=&quot;token&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #032f62;&quot;&gt;&amp;#039;&lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #032f62;&quot;&gt;Starting...&lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #032f62;&quot;&gt;&amp;#039;&lt;/span&gt;&lt;span class=&quot;token&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token&quot;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;token&quot;&gt;            &lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #d73a49;&quot;&gt;-&amp;gt;&lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #6f42c1;&quot;&gt;icon&lt;/span&gt;&lt;span class=&quot;token&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #032f62;&quot;&gt;&amp;#039;&lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #032f62;&quot;&gt;heroicon-o-cog-8-tooth&lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #032f62;&quot;&gt;&amp;#039;&lt;/span&gt;&lt;span class=&quot;token&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token&quot;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;token&quot;&gt;            &lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #d73a49;&quot;&gt;-&amp;gt;&lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #6f42c1;&quot;&gt;info&lt;/span&gt;&lt;span class=&quot;token&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token&quot;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;token&quot;&gt;            &lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #d73a49;&quot;&gt;-&amp;gt;&lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #6f42c1;&quot;&gt;persistent&lt;/span&gt;&lt;span class=&quot;token&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token&quot;&gt;;&lt;/span&gt;&lt;span class=&quot;token&quot;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;token&quot;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;token&quot;&gt;        &lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #005cc5;&quot;&gt;$&lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #005cc5;&quot;&gt;this&lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #d73a49;&quot;&gt;-&amp;gt;&lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #24292e;&quot;&gt;successNotification&lt;/span&gt;&lt;span class=&quot;token&quot;&gt; &lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #d73a49;&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;token&quot;&gt; &lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #005cc5;&quot;&gt;Notification&lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #d73a49;&quot;&gt;::&lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #6f42c1;&quot;&gt;make&lt;/span&gt;&lt;span class=&quot;token&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token&quot;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;token&quot;&gt;            &lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #d73a49;&quot;&gt;-&amp;gt;&lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #6f42c1;&quot;&gt;title&lt;/span&gt;&lt;span class=&quot;token&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #032f62;&quot;&gt;&amp;#039;&lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #032f62;&quot;&gt;Task executed successfully&lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #032f62;&quot;&gt;&amp;#039;&lt;/span&gt;&lt;span class=&quot;token&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token&quot;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;token&quot;&gt;            &lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #d73a49;&quot;&gt;-&amp;gt;&lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #6f42c1;&quot;&gt;success&lt;/span&gt;&lt;span class=&quot;token&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token&quot;&gt;;&lt;/span&gt;&lt;span class=&quot;token&quot;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;token&quot;&gt;    &lt;/span&gt;&lt;span class=&quot;token&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;token&quot;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;token&quot;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;token&quot;&gt;    &lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #d73a49;&quot;&gt;public&lt;/span&gt;&lt;span class=&quot;token&quot;&gt; &lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #d73a49;&quot;&gt;static&lt;/span&gt;&lt;span class=&quot;token&quot;&gt; &lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #d73a49;&quot;&gt;function&lt;/span&gt;&lt;span class=&quot;token&quot;&gt; &lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #6f42c1;&quot;&gt;make&lt;/span&gt;&lt;span class=&quot;token&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #d73a49;&quot;&gt;array&lt;/span&gt;&lt;span class=&quot;token&quot;&gt;|&lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #005cc5;&quot;&gt;Collection&lt;/span&gt;&lt;span class=&quot;token&quot;&gt; &lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #24292e;&quot;&gt;$&lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #24292e;&quot;&gt;jobs&lt;/span&gt;&lt;span class=&quot;token&quot;&gt;,&lt;/span&gt;&lt;span class=&quot;token&quot;&gt; &lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #005cc5;&quot;&gt;User&lt;/span&gt;&lt;span class=&quot;token&quot;&gt; &lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #24292e;&quot;&gt;$&lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #24292e;&quot;&gt;user&lt;/span&gt;&lt;span class=&quot;token&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #d73a49;&quot;&gt;:&lt;/span&gt;&lt;span class=&quot;token&quot;&gt; &lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #d73a49;&quot;&gt;self&lt;/span&gt;&lt;span class=&quot;token&quot;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;token&quot;&gt;    &lt;/span&gt;&lt;span class=&quot;token&quot;&gt;{&lt;/span&gt;&lt;span class=&quot;token&quot;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;token&quot;&gt;        &lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #d73a49;&quot;&gt;return&lt;/span&gt;&lt;span class=&quot;token&quot;&gt; &lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #d73a49;&quot;&gt;new&lt;/span&gt;&lt;span class=&quot;token&quot;&gt; &lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #d73a49;&quot;&gt;self&lt;/span&gt;&lt;span class=&quot;token&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #24292e;&quot;&gt;$&lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #24292e;&quot;&gt;jobs&lt;/span&gt;&lt;span class=&quot;token&quot;&gt;,&lt;/span&gt;&lt;span class=&quot;token&quot;&gt; &lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #24292e;&quot;&gt;$&lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #24292e;&quot;&gt;user&lt;/span&gt;&lt;span class=&quot;token&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token&quot;&gt;;&lt;/span&gt;&lt;span class=&quot;token&quot;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;token&quot;&gt;    &lt;/span&gt;&lt;span class=&quot;token&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;token&quot;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;token&quot;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;token&quot;&gt;    &lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #d73a49;&quot;&gt;public&lt;/span&gt;&lt;span class=&quot;token&quot;&gt; &lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #d73a49;&quot;&gt;function&lt;/span&gt;&lt;span class=&quot;token&quot;&gt; &lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #6f42c1;&quot;&gt;setTitle&lt;/span&gt;&lt;span class=&quot;token&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #d73a49;&quot;&gt;string&lt;/span&gt;&lt;span class=&quot;token&quot;&gt;|&lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #005cc5;&quot;&gt;Closure&lt;/span&gt;&lt;span class=&quot;token&quot;&gt;|&lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #d73a49;&quot;&gt;null&lt;/span&gt;&lt;span class=&quot;token&quot;&gt; &lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #24292e;&quot;&gt;$&lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #24292e;&quot;&gt;title&lt;/span&gt;&lt;span class=&quot;token&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #d73a49;&quot;&gt;:&lt;/span&gt;&lt;span class=&quot;token&quot;&gt; &lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #d73a49;&quot;&gt;self&lt;/span&gt;&lt;span class=&quot;token&quot;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;token&quot;&gt;    &lt;/span&gt;&lt;span class=&quot;token&quot;&gt;{&lt;/span&gt;&lt;span class=&quot;token&quot;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;token&quot;&gt;        &lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #005cc5;&quot;&gt;$&lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #005cc5;&quot;&gt;this&lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #d73a49;&quot;&gt;-&amp;gt;&lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #24292e;&quot;&gt;notification&lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #d73a49;&quot;&gt;-&amp;gt;&lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #6f42c1;&quot;&gt;title&lt;/span&gt;&lt;span class=&quot;token&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #24292e;&quot;&gt;$&lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #24292e;&quot;&gt;title&lt;/span&gt;&lt;span class=&quot;token&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token&quot;&gt;;&lt;/span&gt;&lt;span class=&quot;token&quot;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;token&quot;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;token&quot;&gt;        &lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #d73a49;&quot;&gt;return&lt;/span&gt;&lt;span class=&quot;token&quot;&gt; &lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #005cc5;&quot;&gt;$&lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #005cc5;&quot;&gt;this&lt;/span&gt;&lt;span class=&quot;token&quot;&gt;;&lt;/span&gt;&lt;span class=&quot;token&quot;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;token&quot;&gt;    &lt;/span&gt;&lt;span class=&quot;token&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;token&quot;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;token&quot;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;token&quot;&gt;    &lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #d73a49;&quot;&gt;public&lt;/span&gt;&lt;span class=&quot;token&quot;&gt; &lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #d73a49;&quot;&gt;function&lt;/span&gt;&lt;span class=&quot;token&quot;&gt; &lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #6f42c1;&quot;&gt;setIcon&lt;/span&gt;&lt;span class=&quot;token&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #d73a49;&quot;&gt;string&lt;/span&gt;&lt;span class=&quot;token&quot;&gt;|&lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #005cc5;&quot;&gt;Htmlable&lt;/span&gt;&lt;span class=&quot;token&quot;&gt;|&lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #005cc5;&quot;&gt;Closure&lt;/span&gt;&lt;span class=&quot;token&quot;&gt;|&lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #d73a49;&quot;&gt;null&lt;/span&gt;&lt;span class=&quot;token&quot;&gt; &lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #24292e;&quot;&gt;$&lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #24292e;&quot;&gt;icon&lt;/span&gt;&lt;span class=&quot;token&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #d73a49;&quot;&gt;:&lt;/span&gt;&lt;span class=&quot;token&quot;&gt; &lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #d73a49;&quot;&gt;self&lt;/span&gt;&lt;span class=&quot;token&quot;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;token&quot;&gt;    &lt;/span&gt;&lt;span class=&quot;token&quot;&gt;{&lt;/span&gt;&lt;span class=&quot;token&quot;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;token&quot;&gt;        &lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #005cc5;&quot;&gt;$&lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #005cc5;&quot;&gt;this&lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #d73a49;&quot;&gt;-&amp;gt;&lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #24292e;&quot;&gt;notification&lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #d73a49;&quot;&gt;-&amp;gt;&lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #6f42c1;&quot;&gt;icon&lt;/span&gt;&lt;span class=&quot;token&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #24292e;&quot;&gt;$&lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #24292e;&quot;&gt;icon&lt;/span&gt;&lt;span class=&quot;token&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token&quot;&gt;;&lt;/span&gt;&lt;span class=&quot;token&quot;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;token&quot;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;token&quot;&gt;        &lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #d73a49;&quot;&gt;return&lt;/span&gt;&lt;span class=&quot;token&quot;&gt; &lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #005cc5;&quot;&gt;$&lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #005cc5;&quot;&gt;this&lt;/span&gt;&lt;span class=&quot;token&quot;&gt;;&lt;/span&gt;&lt;span class=&quot;token&quot;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;token&quot;&gt;    &lt;/span&gt;&lt;span class=&quot;token&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;token&quot;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;token&quot;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;token&quot;&gt;    &lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #d73a49;&quot;&gt;public&lt;/span&gt;&lt;span class=&quot;token&quot;&gt; &lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #d73a49;&quot;&gt;function&lt;/span&gt;&lt;span class=&quot;token&quot;&gt; &lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #6f42c1;&quot;&gt;dispatch&lt;/span&gt;&lt;span class=&quot;token&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #d73a49;&quot;&gt;:&lt;/span&gt;&lt;span class=&quot;token&quot;&gt; &lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #d73a49;&quot;&gt;self&lt;/span&gt;&lt;span class=&quot;token&quot;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;token&quot;&gt;    &lt;/span&gt;&lt;span class=&quot;token&quot;&gt;{&lt;/span&gt;&lt;span class=&quot;token&quot;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;token&quot;&gt;        &lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #24292e;&quot;&gt;$&lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #24292e;&quot;&gt;notificationId&lt;/span&gt;&lt;span class=&quot;token&quot;&gt; &lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #d73a49;&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;token&quot;&gt; &lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #005cc5;&quot;&gt;$&lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #005cc5;&quot;&gt;this&lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #d73a49;&quot;&gt;-&amp;gt;&lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #24292e;&quot;&gt;notification&lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #d73a49;&quot;&gt;-&amp;gt;&lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #6f42c1;&quot;&gt;getId&lt;/span&gt;&lt;span class=&quot;token&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token&quot;&gt;;&lt;/span&gt;&lt;span class=&quot;token&quot;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;token&quot;&gt;        &lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #24292e;&quot;&gt;$&lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #24292e;&quot;&gt;userId&lt;/span&gt;&lt;span class=&quot;token&quot;&gt; &lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #d73a49;&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;token&quot;&gt; &lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #005cc5;&quot;&gt;$&lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #005cc5;&quot;&gt;this&lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #d73a49;&quot;&gt;-&amp;gt;&lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #24292e;&quot;&gt;user&lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #d73a49;&quot;&gt;-&amp;gt;&lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #24292e;&quot;&gt;id&lt;/span&gt;&lt;span class=&quot;token&quot;&gt;;&lt;/span&gt;&lt;span class=&quot;token&quot;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;token&quot;&gt;        &lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #24292e;&quot;&gt;$&lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #24292e;&quot;&gt;successNotification&lt;/span&gt;&lt;span class=&quot;token&quot;&gt; &lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #d73a49;&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;token&quot;&gt; &lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #005cc5;&quot;&gt;$&lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #005cc5;&quot;&gt;this&lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #d73a49;&quot;&gt;-&amp;gt;&lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #24292e;&quot;&gt;successNotification&lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #d73a49;&quot;&gt;-&amp;gt;&lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #6f42c1;&quot;&gt;toArray&lt;/span&gt;&lt;span class=&quot;token&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token&quot;&gt;;&lt;/span&gt;&lt;span class=&quot;token&quot;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;token&quot;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;token&quot;&gt;        &lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #005cc5;&quot;&gt;$&lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #005cc5;&quot;&gt;this&lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #d73a49;&quot;&gt;-&amp;gt;&lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #24292e;&quot;&gt;batch&lt;/span&gt;&lt;span class=&quot;token&quot;&gt; &lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #d73a49;&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;token&quot;&gt; &lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #005cc5;&quot;&gt;Bus&lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #d73a49;&quot;&gt;::&lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #6f42c1;&quot;&gt;batch&lt;/span&gt;&lt;span class=&quot;token&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #005cc5;&quot;&gt;$&lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #005cc5;&quot;&gt;this&lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #d73a49;&quot;&gt;-&amp;gt;&lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #24292e;&quot;&gt;jobs&lt;/span&gt;&lt;span class=&quot;token&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token&quot;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;token&quot;&gt;            &lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #d73a49;&quot;&gt;-&amp;gt;&lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #6f42c1;&quot;&gt;progress&lt;/span&gt;&lt;span class=&quot;token&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #d73a49;&quot;&gt;function&lt;/span&gt;&lt;span class=&quot;token&quot;&gt; &lt;/span&gt;&lt;span class=&quot;token&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #005cc5;&quot;&gt;Batch&lt;/span&gt;&lt;span class=&quot;token&quot;&gt; &lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #24292e;&quot;&gt;$&lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #24292e;&quot;&gt;batch&lt;/span&gt;&lt;span class=&quot;token&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token&quot;&gt; &lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #d73a49;&quot;&gt;use&lt;/span&gt;&lt;span class=&quot;token&quot;&gt; &lt;/span&gt;&lt;span class=&quot;token&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #24292e;&quot;&gt;$&lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #24292e;&quot;&gt;notificationId&lt;/span&gt;&lt;span class=&quot;token&quot;&gt;,&lt;/span&gt;&lt;span class=&quot;token&quot;&gt; &lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #24292e;&quot;&gt;$&lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #24292e;&quot;&gt;userId&lt;/span&gt;&lt;span class=&quot;token&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token&quot;&gt; &lt;/span&gt;&lt;span class=&quot;token&quot;&gt;{&lt;/span&gt;&lt;span class=&quot;token&quot;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;token&quot;&gt;                &lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #d73a49;&quot;&gt;self&lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #d73a49;&quot;&gt;::&lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #6f42c1;&quot;&gt;updateNotificationProgress&lt;/span&gt;&lt;span class=&quot;token&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #24292e;&quot;&gt;$&lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #24292e;&quot;&gt;batch&lt;/span&gt;&lt;span class=&quot;token&quot;&gt;,&lt;/span&gt;&lt;span class=&quot;token&quot;&gt; &lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #24292e;&quot;&gt;$&lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #24292e;&quot;&gt;notificationId&lt;/span&gt;&lt;span class=&quot;token&quot;&gt;,&lt;/span&gt;&lt;span class=&quot;token&quot;&gt; &lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #24292e;&quot;&gt;$&lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #24292e;&quot;&gt;userId&lt;/span&gt;&lt;span class=&quot;token&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token&quot;&gt;;&lt;/span&gt;&lt;span class=&quot;token&quot;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;token&quot;&gt;            &lt;/span&gt;&lt;span class=&quot;token&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;token&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token&quot;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;token&quot;&gt;            &lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #d73a49;&quot;&gt;-&amp;gt;&lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #6f42c1;&quot;&gt;finally&lt;/span&gt;&lt;span class=&quot;token&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #d73a49;&quot;&gt;function&lt;/span&gt;&lt;span class=&quot;token&quot;&gt; &lt;/span&gt;&lt;span class=&quot;token&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #005cc5;&quot;&gt;Batch&lt;/span&gt;&lt;span class=&quot;token&quot;&gt; &lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #24292e;&quot;&gt;$&lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #24292e;&quot;&gt;batch&lt;/span&gt;&lt;span class=&quot;token&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token&quot;&gt; &lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #d73a49;&quot;&gt;use&lt;/span&gt;&lt;span class=&quot;token&quot;&gt; &lt;/span&gt;&lt;span class=&quot;token&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #24292e;&quot;&gt;$&lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #24292e;&quot;&gt;notificationId&lt;/span&gt;&lt;span class=&quot;token&quot;&gt;,&lt;/span&gt;&lt;span class=&quot;token&quot;&gt; &lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #24292e;&quot;&gt;$&lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #24292e;&quot;&gt;userId&lt;/span&gt;&lt;span class=&quot;token&quot;&gt;,&lt;/span&gt;&lt;span class=&quot;token&quot;&gt; &lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #24292e;&quot;&gt;$&lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #24292e;&quot;&gt;successNotification&lt;/span&gt;&lt;span class=&quot;token&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token&quot;&gt; &lt;/span&gt;&lt;span class=&quot;token&quot;&gt;{&lt;/span&gt;&lt;span class=&quot;token&quot;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;token&quot;&gt;                &lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #d73a49;&quot;&gt;self&lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #d73a49;&quot;&gt;::&lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #6f42c1;&quot;&gt;updateNotificationProgress&lt;/span&gt;&lt;span class=&quot;token&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #24292e;&quot;&gt;$&lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #24292e;&quot;&gt;batch&lt;/span&gt;&lt;span class=&quot;token&quot;&gt;,&lt;/span&gt;&lt;span class=&quot;token&quot;&gt; &lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #24292e;&quot;&gt;$&lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #24292e;&quot;&gt;notificationId&lt;/span&gt;&lt;span class=&quot;token&quot;&gt;,&lt;/span&gt;&lt;span class=&quot;token&quot;&gt; &lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #24292e;&quot;&gt;$&lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #24292e;&quot;&gt;userId&lt;/span&gt;&lt;span class=&quot;token&quot;&gt;,&lt;/span&gt;&lt;span class=&quot;token&quot;&gt; &lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #24292e;&quot;&gt;$&lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #24292e;&quot;&gt;successNotification&lt;/span&gt;&lt;span class=&quot;token&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token&quot;&gt;;&lt;/span&gt;&lt;span class=&quot;token&quot;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;token&quot;&gt;            &lt;/span&gt;&lt;span class=&quot;token&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;token&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token&quot;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;token&quot;&gt;            &lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #d73a49;&quot;&gt;-&amp;gt;&lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #6f42c1;&quot;&gt;dispatch&lt;/span&gt;&lt;span class=&quot;token&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token&quot;&gt;;&lt;/span&gt;&lt;span class=&quot;token&quot;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;token&quot;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;token&quot;&gt;        &lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #005cc5;&quot;&gt;$&lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #005cc5;&quot;&gt;this&lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #d73a49;&quot;&gt;-&amp;gt;&lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #24292e;&quot;&gt;notification&lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #d73a49;&quot;&gt;-&amp;gt;&lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #6f42c1;&quot;&gt;send&lt;/span&gt;&lt;span class=&quot;token&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token&quot;&gt;;&lt;/span&gt;&lt;span class=&quot;token&quot;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;token&quot;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;token&quot;&gt;        &lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #d73a49;&quot;&gt;return&lt;/span&gt;&lt;span class=&quot;token&quot;&gt; &lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #005cc5;&quot;&gt;$&lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #005cc5;&quot;&gt;this&lt;/span&gt;&lt;span class=&quot;token&quot;&gt;;&lt;/span&gt;&lt;span class=&quot;token&quot;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;token&quot;&gt;    &lt;/span&gt;&lt;span class=&quot;token&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;token&quot;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;token&quot;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;token&quot;&gt;    &lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #d73a49;&quot;&gt;public&lt;/span&gt;&lt;span class=&quot;token&quot;&gt; &lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #d73a49;&quot;&gt;function&lt;/span&gt;&lt;span class=&quot;token&quot;&gt; &lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #6f42c1;&quot;&gt;setSuccessNotification&lt;/span&gt;&lt;span class=&quot;token&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #005cc5;&quot;&gt;Closure&lt;/span&gt;&lt;span class=&quot;token&quot;&gt; &lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #24292e;&quot;&gt;$&lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #24292e;&quot;&gt;callable&lt;/span&gt;&lt;span class=&quot;token&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #d73a49;&quot;&gt;:&lt;/span&gt;&lt;span class=&quot;token&quot;&gt; &lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #d73a49;&quot;&gt;self&lt;/span&gt;&lt;span class=&quot;token&quot;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;token&quot;&gt;    &lt;/span&gt;&lt;span class=&quot;token&quot;&gt;{&lt;/span&gt;&lt;span class=&quot;token&quot;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;token&quot;&gt;        &lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #005cc5;&quot;&gt;$&lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #005cc5;&quot;&gt;this&lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #d73a49;&quot;&gt;-&amp;gt;&lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #24292e;&quot;&gt;successNotification&lt;/span&gt;&lt;span class=&quot;token&quot;&gt; &lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #d73a49;&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;token&quot;&gt; &lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #24292e;&quot;&gt;$&lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #24292e;&quot;&gt;callable&lt;/span&gt;&lt;span class=&quot;token&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #005cc5;&quot;&gt;$&lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #005cc5;&quot;&gt;this&lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #d73a49;&quot;&gt;-&amp;gt;&lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #24292e;&quot;&gt;successNotification&lt;/span&gt;&lt;span class=&quot;token&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token&quot;&gt;;&lt;/span&gt;&lt;span class=&quot;token&quot;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;token&quot;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;token&quot;&gt;        &lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #d73a49;&quot;&gt;return&lt;/span&gt;&lt;span class=&quot;token&quot;&gt; &lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #005cc5;&quot;&gt;$&lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #005cc5;&quot;&gt;this&lt;/span&gt;&lt;span class=&quot;token&quot;&gt;;&lt;/span&gt;&lt;span class=&quot;token&quot;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;token&quot;&gt;    &lt;/span&gt;&lt;span class=&quot;token&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;token&quot;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;token&quot;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;token&quot;&gt;    &lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #d73a49;&quot;&gt;public&lt;/span&gt;&lt;span class=&quot;token&quot;&gt; &lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #d73a49;&quot;&gt;function&lt;/span&gt;&lt;span class=&quot;token&quot;&gt; &lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #6f42c1;&quot;&gt;getBatchId&lt;/span&gt;&lt;span class=&quot;token&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #d73a49;&quot;&gt;:&lt;/span&gt;&lt;span class=&quot;token&quot;&gt; &lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #d73a49;&quot;&gt;string&lt;/span&gt;&lt;span class=&quot;token&quot;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;token&quot;&gt;    &lt;/span&gt;&lt;span class=&quot;token&quot;&gt;{&lt;/span&gt;&lt;span class=&quot;token&quot;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;token&quot;&gt;        &lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #d73a49;&quot;&gt;if&lt;/span&gt;&lt;span class=&quot;token&quot;&gt; &lt;/span&gt;&lt;span class=&quot;token&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #005cc5;&quot;&gt;$&lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #005cc5;&quot;&gt;this&lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #d73a49;&quot;&gt;-&amp;gt;&lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #24292e;&quot;&gt;batch&lt;/span&gt;&lt;span class=&quot;token&quot;&gt; &lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #d73a49;&quot;&gt;instanceof&lt;/span&gt;&lt;span class=&quot;token&quot;&gt; &lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #005cc5;&quot;&gt;PendingBatch&lt;/span&gt;&lt;span class=&quot;token&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token&quot;&gt; &lt;/span&gt;&lt;span class=&quot;token&quot;&gt;{&lt;/span&gt;&lt;span class=&quot;token&quot;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;token&quot;&gt;            &lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #d73a49;&quot;&gt;throw&lt;/span&gt;&lt;span class=&quot;token&quot;&gt; &lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #d73a49;&quot;&gt;new&lt;/span&gt;&lt;span class=&quot;token&quot;&gt; &lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #005cc5;&quot;&gt;Exception&lt;/span&gt;&lt;span class=&quot;token&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #032f62;&quot;&gt;&amp;#039;&lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #032f62;&quot;&gt;Batch has not been dispatched yet&lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #032f62;&quot;&gt;&amp;#039;&lt;/span&gt;&lt;span class=&quot;token&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token&quot;&gt;;&lt;/span&gt;&lt;span class=&quot;token&quot;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;token&quot;&gt;        &lt;/span&gt;&lt;span class=&quot;token&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;token&quot;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;token&quot;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;token&quot;&gt;        &lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #d73a49;&quot;&gt;return&lt;/span&gt;&lt;span class=&quot;token&quot;&gt; &lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #005cc5;&quot;&gt;$&lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #005cc5;&quot;&gt;this&lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #d73a49;&quot;&gt;-&amp;gt;&lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #24292e;&quot;&gt;batch&lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #d73a49;&quot;&gt;-&amp;gt;&lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #24292e;&quot;&gt;id&lt;/span&gt;&lt;span class=&quot;token&quot;&gt;;&lt;/span&gt;&lt;span class=&quot;token&quot;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;token&quot;&gt;    &lt;/span&gt;&lt;span class=&quot;token&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;token&quot;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;token&quot;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;token&quot;&gt;    &lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #d73a49;&quot;&gt;public&lt;/span&gt;&lt;span class=&quot;token&quot;&gt; &lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #d73a49;&quot;&gt;function&lt;/span&gt;&lt;span class=&quot;token&quot;&gt; &lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #6f42c1;&quot;&gt;getNotificationId&lt;/span&gt;&lt;span class=&quot;token&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #d73a49;&quot;&gt;:&lt;/span&gt;&lt;span class=&quot;token&quot;&gt; &lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #d73a49;&quot;&gt;string&lt;/span&gt;&lt;span class=&quot;token&quot;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;token&quot;&gt;    &lt;/span&gt;&lt;span class=&quot;token&quot;&gt;{&lt;/span&gt;&lt;span class=&quot;token&quot;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;token&quot;&gt;        &lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #d73a49;&quot;&gt;return&lt;/span&gt;&lt;span class=&quot;token&quot;&gt; &lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #005cc5;&quot;&gt;$&lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #005cc5;&quot;&gt;this&lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #d73a49;&quot;&gt;-&amp;gt;&lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #24292e;&quot;&gt;notification&lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #d73a49;&quot;&gt;-&amp;gt;&lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #6f42c1;&quot;&gt;getId&lt;/span&gt;&lt;span class=&quot;token&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token&quot;&gt;;&lt;/span&gt;&lt;span class=&quot;token&quot;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;token&quot;&gt;    &lt;/span&gt;&lt;span class=&quot;token&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;token&quot;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;token&quot;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;token&quot;&gt;    &lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #d73a49;&quot;&gt;public&lt;/span&gt;&lt;span class=&quot;token&quot;&gt; &lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #d73a49;&quot;&gt;static&lt;/span&gt;&lt;span class=&quot;token&quot;&gt; &lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #d73a49;&quot;&gt;function&lt;/span&gt;&lt;span class=&quot;token&quot;&gt; &lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #6f42c1;&quot;&gt;updateNotificationProgress&lt;/span&gt;&lt;span class=&quot;token&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #005cc5;&quot;&gt;Batch&lt;/span&gt;&lt;span class=&quot;token&quot;&gt; &lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #24292e;&quot;&gt;$&lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #24292e;&quot;&gt;batch&lt;/span&gt;&lt;span class=&quot;token&quot;&gt;,&lt;/span&gt;&lt;span class=&quot;token&quot;&gt; &lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #d73a49;&quot;&gt;string&lt;/span&gt;&lt;span class=&quot;token&quot;&gt; &lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #24292e;&quot;&gt;$&lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #24292e;&quot;&gt;notificationId&lt;/span&gt;&lt;span class=&quot;token&quot;&gt;,&lt;/span&gt;&lt;span class=&quot;token&quot;&gt; &lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #d73a49;&quot;&gt;int&lt;/span&gt;&lt;span class=&quot;token&quot;&gt; &lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #24292e;&quot;&gt;$&lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #24292e;&quot;&gt;userId&lt;/span&gt;&lt;span class=&quot;token&quot;&gt;,&lt;/span&gt;&lt;span class=&quot;token&quot;&gt; &lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #d73a49;&quot;&gt;?&lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #d73a49;&quot;&gt;array&lt;/span&gt;&lt;span class=&quot;token&quot;&gt; &lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #24292e;&quot;&gt;$&lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #24292e;&quot;&gt;successNotification&lt;/span&gt;&lt;span class=&quot;token&quot;&gt; &lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #d73a49;&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;token&quot;&gt; &lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #005cc5;&quot;&gt;null&lt;/span&gt;&lt;span class=&quot;token&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #d73a49;&quot;&gt;:&lt;/span&gt;&lt;span class=&quot;token&quot;&gt; &lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #d73a49;&quot;&gt;void&lt;/span&gt;&lt;span class=&quot;token&quot;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;token&quot;&gt;    &lt;/span&gt;&lt;span class=&quot;token&quot;&gt;{&lt;/span&gt;&lt;span class=&quot;token&quot;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;token&quot;&gt;        &lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #24292e;&quot;&gt;$&lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #24292e;&quot;&gt;body&lt;/span&gt;&lt;span class=&quot;token&quot;&gt; &lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #d73a49;&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;token&quot;&gt; &lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #24292e;&quot;&gt;$&lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #24292e;&quot;&gt;batch&lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #d73a49;&quot;&gt;-&amp;gt;&lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #6f42c1;&quot;&gt;progress&lt;/span&gt;&lt;span class=&quot;token&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #d73a49;&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #032f62;&quot;&gt;&amp;#039;&lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #032f62;&quot;&gt;% done&lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #032f62;&quot;&gt;&amp;#039;&lt;/span&gt;&lt;span class=&quot;token&quot;&gt;;&lt;/span&gt;&lt;span class=&quot;token&quot;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;token&quot;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;token&quot;&gt;        &lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #005cc5;&quot;&gt;Broadcast&lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #d73a49;&quot;&gt;::&lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #6f42c1;&quot;&gt;private&lt;/span&gt;&lt;span class=&quot;token&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #032f62;&quot;&gt;&amp;#039;&lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #032f62;&quot;&gt;App.Models.User.&lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #032f62;&quot;&gt;&amp;#039;&lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #d73a49;&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #24292e;&quot;&gt;$&lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #24292e;&quot;&gt;userId&lt;/span&gt;&lt;span class=&quot;token&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token&quot;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;token&quot;&gt;            &lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #d73a49;&quot;&gt;-&amp;gt;&lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #6f42c1;&quot;&gt;as&lt;/span&gt;&lt;span class=&quot;token&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #032f62;&quot;&gt;&amp;#039;&lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #032f62;&quot;&gt;UpdateNotificationBody&lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #032f62;&quot;&gt;&amp;#039;&lt;/span&gt;&lt;span class=&quot;token&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token&quot;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;token&quot;&gt;            &lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #d73a49;&quot;&gt;-&amp;gt;&lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #6f42c1;&quot;&gt;with&lt;/span&gt;&lt;span class=&quot;token&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;token&quot;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;token&quot;&gt;                &lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #032f62;&quot;&gt;&amp;#039;&lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #032f62;&quot;&gt;id&lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #032f62;&quot;&gt;&amp;#039;&lt;/span&gt;&lt;span class=&quot;token&quot;&gt; &lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #d73a49;&quot;&gt;=&amp;gt;&lt;/span&gt;&lt;span class=&quot;token&quot;&gt; &lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #24292e;&quot;&gt;$&lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #24292e;&quot;&gt;notificationId&lt;/span&gt;&lt;span class=&quot;token&quot;&gt;,&lt;/span&gt;&lt;span class=&quot;token&quot;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;token&quot;&gt;                &lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #032f62;&quot;&gt;&amp;#039;&lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #032f62;&quot;&gt;body&lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #032f62;&quot;&gt;&amp;#039;&lt;/span&gt;&lt;span class=&quot;token&quot;&gt; &lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #d73a49;&quot;&gt;=&amp;gt;&lt;/span&gt;&lt;span class=&quot;token&quot;&gt; &lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #24292e;&quot;&gt;$&lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #24292e;&quot;&gt;body&lt;/span&gt;&lt;span class=&quot;token&quot;&gt;,&lt;/span&gt;&lt;span class=&quot;token&quot;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;token&quot;&gt;            &lt;/span&gt;&lt;span class=&quot;token&quot;&gt;]&lt;/span&gt;&lt;span class=&quot;token&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token&quot;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;token&quot;&gt;            &lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #d73a49;&quot;&gt;-&amp;gt;&lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #6f42c1;&quot;&gt;sendNow&lt;/span&gt;&lt;span class=&quot;token&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token&quot;&gt;;&lt;/span&gt;&lt;span class=&quot;token&quot;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;token&quot;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;token&quot;&gt;        &lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #d73a49;&quot;&gt;if&lt;/span&gt;&lt;span class=&quot;token&quot;&gt; &lt;/span&gt;&lt;span class=&quot;token&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #24292e;&quot;&gt;$&lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #24292e;&quot;&gt;batch&lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #d73a49;&quot;&gt;-&amp;gt;&lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #6f42c1;&quot;&gt;finished&lt;/span&gt;&lt;span class=&quot;token&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token&quot;&gt; &lt;/span&gt;&lt;span class=&quot;token&quot;&gt;{&lt;/span&gt;&lt;span class=&quot;token&quot;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;token&quot;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;token&quot;&gt;            &lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #d73a49;&quot;&gt;if&lt;/span&gt;&lt;span class=&quot;token&quot;&gt; &lt;/span&gt;&lt;span class=&quot;token&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #24292e;&quot;&gt;$&lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #24292e;&quot;&gt;successNotification&lt;/span&gt;&lt;span class=&quot;token&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token&quot;&gt; &lt;/span&gt;&lt;span class=&quot;token&quot;&gt;{&lt;/span&gt;&lt;span class=&quot;token&quot;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;token&quot;&gt;                &lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #005cc5;&quot;&gt;Notification&lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #d73a49;&quot;&gt;::&lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #6f42c1;&quot;&gt;fromArray&lt;/span&gt;&lt;span class=&quot;token&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #24292e;&quot;&gt;$&lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #24292e;&quot;&gt;successNotification&lt;/span&gt;&lt;span class=&quot;token&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #d73a49;&quot;&gt;-&amp;gt;&lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #6f42c1;&quot;&gt;broadcast&lt;/span&gt;&lt;span class=&quot;token&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #005cc5;&quot;&gt;User&lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #d73a49;&quot;&gt;::&lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #6f42c1;&quot;&gt;find&lt;/span&gt;&lt;span class=&quot;token&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #24292e;&quot;&gt;$&lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #24292e;&quot;&gt;userId&lt;/span&gt;&lt;span class=&quot;token&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token&quot;&gt;;&lt;/span&gt;&lt;span class=&quot;token&quot;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;token&quot;&gt;            &lt;/span&gt;&lt;span class=&quot;token&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;token&quot;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;token&quot;&gt;            &lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #005cc5;&quot;&gt;Broadcast&lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #d73a49;&quot;&gt;::&lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #6f42c1;&quot;&gt;private&lt;/span&gt;&lt;span class=&quot;token&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #032f62;&quot;&gt;&amp;#039;&lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #032f62;&quot;&gt;App.Models.User.&lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #032f62;&quot;&gt;&amp;#039;&lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #d73a49;&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #24292e;&quot;&gt;$&lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #24292e;&quot;&gt;userId&lt;/span&gt;&lt;span class=&quot;token&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token&quot;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;token&quot;&gt;                &lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #d73a49;&quot;&gt;-&amp;gt;&lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #6f42c1;&quot;&gt;as&lt;/span&gt;&lt;span class=&quot;token&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #032f62;&quot;&gt;&amp;#039;&lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #032f62;&quot;&gt;CloseNotification&lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #032f62;&quot;&gt;&amp;#039;&lt;/span&gt;&lt;span class=&quot;token&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token&quot;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;token&quot;&gt;                &lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #d73a49;&quot;&gt;-&amp;gt;&lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #6f42c1;&quot;&gt;with&lt;/span&gt;&lt;span class=&quot;token&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #032f62;&quot;&gt;&amp;#039;&lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #032f62;&quot;&gt;id&lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #032f62;&quot;&gt;&amp;#039;&lt;/span&gt;&lt;span class=&quot;token&quot;&gt; &lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #d73a49;&quot;&gt;=&amp;gt;&lt;/span&gt;&lt;span class=&quot;token&quot;&gt; &lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #24292e;&quot;&gt;$&lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #24292e;&quot;&gt;notificationId&lt;/span&gt;&lt;span class=&quot;token&quot;&gt;]&lt;/span&gt;&lt;span class=&quot;token&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token&quot;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;token&quot;&gt;                &lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #d73a49;&quot;&gt;-&amp;gt;&lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #6f42c1;&quot;&gt;send&lt;/span&gt;&lt;span class=&quot;token&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token&quot;&gt;;&lt;/span&gt;&lt;span class=&quot;token&quot;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;token&quot;&gt;        &lt;/span&gt;&lt;span class=&quot;token&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;token&quot;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;token&quot;&gt;    &lt;/span&gt;&lt;span class=&quot;token&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;token&quot;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;token&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;token&quot;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;h3&gt;&lt;a id=&quot;content-use-it-on-your-project&quot; href=&quot;#content-use-it-on-your-project&quot; class=&quot;heading-permalink&quot; aria-hidden=&quot;true&quot; tabindex=&quot;-1&quot; title=&quot;Permalink&quot;&gt;#&lt;/a&gt;Use it on your project&lt;/h3&gt;
&lt;p&gt;Now we take our previous code, and use our knewly created &lt;code&gt;BackgroundTasks&lt;/code&gt; helper!&lt;/p&gt;
&lt;div x-data=&quot;codeBlock&quot; class=&quot;code-block relative&quot;&gt;&lt;div class=&quot;flex space-x-2 items-center absolute top-0 right-0&quot;&gt;
    &lt;div x-cloak x-show=&quot;showMessage&quot; x-transition class=&quot;py-2 animate-bounce transition duration-300 mt-1 text-sky-500 text-xs&quot;&gt;Copied!&lt;/div&gt;
    &lt;button
        type=&quot;button&quot;
        title=&quot;Copy to clipboard&quot;
        class=&quot;hidden sm:block p-2 pl-3 transition duration-300&quot;
        @click.prevent=&quot;copyToClipboard&quot;
        :class=&quot;{
            'text-black/30 hover:text-black/80': !showMessage,
            'text-sky-500 hover:text-sky-700': showMessage,
        }&quot;&gt;
        &lt;svg xmlns=&quot;http://www.w3.org/2000/svg&quot; fill=&quot;none&quot; viewBox=&quot;0 0 24 24&quot; stroke-width=&quot;1.5&quot; stroke=&quot;currentColor&quot; class=&quot;block w-6 h-6&quot;&gt;
            &lt;path fill=&quot;white&quot; stroke-linecap=&quot;round&quot; stroke-linejoin=&quot;round&quot; d=&quot;M11.35 3.836c-.065.21-.1.433-.1.664 0 .414.336.75.75.75h4.5a.75.75 0 00.75-.75 2.25 2.25 0 00-.1-.664m-5.8 0A2.251 2.251 0 0113.5 2.25H15c1.012 0 1.867.668 2.15 1.586m-5.8 0c-.376.023-.75.05-1.124.08C9.095 4.01 8.25 4.973 8.25 6.108V8.25m8.9-4.414c.376.023.75.05 1.124.08 1.131.094 1.976 1.057 1.976 2.192V16.5A2.25 2.25 0 0118 18.75h-2.25m-7.5-10.5H4.875c-.621 0-1.125.504-1.125 1.125v11.25c0 .621.504 1.125 1.125 1.125h9.75c.621 0 1.125-.504 1.125-1.125V18.75m-7.5-10.5h6.375c.621 0 1.125.504 1.125 1.125v9.375m-8.25-3l1.5 1.5 3-3.75&quot; /&gt;
        &lt;/svg&gt;
    &lt;/button&gt;
&lt;/div&gt;&lt;pre class=&quot;phiki language-php github-light&quot; data-language=&quot;php&quot; style=&quot;background-color: #fff;color: #24292e;&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;token&quot;&gt;#[&lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #005cc5;&quot;&gt;Renderless&lt;/span&gt;&lt;span class=&quot;token&quot;&gt;]&lt;/span&gt;&lt;span class=&quot;token&quot;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;token&quot; style=&quot;color: #d73a49;&quot;&gt;public&lt;/span&gt;&lt;span class=&quot;token&quot;&gt; &lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #d73a49;&quot;&gt;function&lt;/span&gt;&lt;span class=&quot;token&quot;&gt; &lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #6f42c1;&quot;&gt;checkIssues&lt;/span&gt;&lt;span class=&quot;token&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token&quot;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;token&quot;&gt;{&lt;/span&gt;&lt;span class=&quot;token&quot;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;token&quot;&gt;  &lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #24292e;&quot;&gt;$&lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #24292e;&quot;&gt;jobs&lt;/span&gt;&lt;span class=&quot;token&quot;&gt; &lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #d73a49;&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;token&quot;&gt; &lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #005cc5;&quot;&gt;$&lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #005cc5;&quot;&gt;this&lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #d73a49;&quot;&gt;-&amp;gt;&lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #24292e;&quot;&gt;zone&lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #d73a49;&quot;&gt;-&amp;gt;&lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #6f42c1;&quot;&gt;records&lt;/span&gt;&lt;span class=&quot;token&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #d73a49;&quot;&gt;-&amp;gt;&lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #6f42c1;&quot;&gt;get&lt;/span&gt;&lt;span class=&quot;token&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token&quot;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;token&quot;&gt;    &lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #d73a49;&quot;&gt;-&amp;gt;&lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #6f42c1;&quot;&gt;map&lt;/span&gt;&lt;span class=&quot;token&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #d73a49;&quot;&gt;fn&lt;/span&gt;&lt;span class=&quot;token&quot;&gt; &lt;/span&gt;&lt;span class=&quot;token&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #24292e;&quot;&gt;$&lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #24292e;&quot;&gt;record&lt;/span&gt;&lt;span class=&quot;token&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token&quot;&gt; &lt;/span&gt;&lt;span class=&quot;token&quot;&gt;=&amp;gt;&lt;/span&gt;&lt;span class=&quot;token&quot;&gt; &lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #d73a49;&quot;&gt;new&lt;/span&gt;&lt;span class=&quot;token&quot;&gt; &lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #005cc5;&quot;&gt;CheckZoneRecord&lt;/span&gt;&lt;span class=&quot;token&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #24292e;&quot;&gt;$&lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #24292e;&quot;&gt;record&lt;/span&gt;&lt;span class=&quot;token&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token&quot;&gt;;&lt;/span&gt;&lt;span class=&quot;token&quot;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;token&quot;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;token&quot;&gt;  &lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #005cc5;&quot;&gt;BackgroundTasks&lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #d73a49;&quot;&gt;::&lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #6f42c1;&quot;&gt;make&lt;/span&gt;&lt;span class=&quot;token&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #24292e;&quot;&gt;$&lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #24292e;&quot;&gt;jobs&lt;/span&gt;&lt;span class=&quot;token&quot;&gt;,&lt;/span&gt;&lt;span class=&quot;token&quot;&gt; &lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #005cc5;&quot;&gt;$&lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #005cc5;&quot;&gt;this&lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #d73a49;&quot;&gt;-&amp;gt;&lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #24292e;&quot;&gt;user&lt;/span&gt;&lt;span class=&quot;token&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token&quot;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;token&quot;&gt;    &lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #d73a49;&quot;&gt;-&amp;gt;&lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #6f42c1;&quot;&gt;setTitle&lt;/span&gt;&lt;span class=&quot;token&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #032f62;&quot;&gt;&amp;#039;&lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #032f62;&quot;&gt;Checking for new issues&lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #032f62;&quot;&gt;&amp;#039;&lt;/span&gt;&lt;span class=&quot;token&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token&quot;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;token&quot;&gt;    &lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #d73a49;&quot;&gt;-&amp;gt;&lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #6f42c1;&quot;&gt;setSuccessNotification&lt;/span&gt;&lt;span class=&quot;token&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #d73a49;&quot;&gt;function&lt;/span&gt;&lt;span class=&quot;token&quot;&gt; &lt;/span&gt;&lt;span class=&quot;token&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #005cc5;&quot;&gt;Notification&lt;/span&gt;&lt;span class=&quot;token&quot;&gt; &lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #24292e;&quot;&gt;$&lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #24292e;&quot;&gt;notification&lt;/span&gt;&lt;span class=&quot;token&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token&quot;&gt; &lt;/span&gt;&lt;span class=&quot;token&quot;&gt;{&lt;/span&gt;&lt;span class=&quot;token&quot;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;token&quot;&gt;		&lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #d73a49;&quot;&gt;return&lt;/span&gt;&lt;span class=&quot;token&quot;&gt; &lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #24292e;&quot;&gt;$&lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #24292e;&quot;&gt;notification&lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #d73a49;&quot;&gt;-&amp;gt;&lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #6f42c1;&quot;&gt;title&lt;/span&gt;&lt;span class=&quot;token&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #032f62;&quot;&gt;&amp;#039;&lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #032f62;&quot;&gt;Issues checked !&lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #032f62;&quot;&gt;&amp;#039;&lt;/span&gt;&lt;span class=&quot;token&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token&quot;&gt;;&lt;/span&gt;&lt;span class=&quot;token&quot;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;token&quot;&gt;    &lt;/span&gt;&lt;span class=&quot;token&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;token&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token&quot;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;token&quot;&gt;    &lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #d73a49;&quot;&gt;-&amp;gt;&lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #6f42c1;&quot;&gt;dispatch&lt;/span&gt;&lt;span class=&quot;token&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token&quot;&gt;;&lt;/span&gt;&lt;span class=&quot;token&quot;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;token&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;token&quot;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;And here it is !&lt;/p&gt;
&lt;div class=&quot;flex justify-around&quot;&gt;&lt;iframe width=&quot;560&quot; height=&quot;315&quot; src=&quot;https://www.youtube.com/embed/OvI5Hu9-owU?si=5fyb3yU0vBk-uEvF&amp;rel=0&amp;showinfo=0&amp;modestbranding=1&quot; title=&quot;YouTube video player&quot; frameborder=&quot;0&quot; allow=&quot;accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture; web-share&quot; referrerpolicy=&quot;strict-origin-when-cross-origin&quot; allowfullscreen&gt;&lt;/iframe&gt;&lt;/div&gt;
&lt;h2&gt;&lt;a id=&quot;content-security-concern&quot; href=&quot;#content-security-concern&quot; class=&quot;heading-permalink&quot; aria-hidden=&quot;true&quot; tabindex=&quot;-1&quot; title=&quot;Permalink&quot;&gt;#&lt;/a&gt;Security concern&lt;/h2&gt;
&lt;p&gt;Since I know that I'm not using any HTML in my notifications, my version uses &lt;code&gt;x-text&lt;/code&gt;. In this article, I changed it to &lt;code&gt;x-html&lt;/code&gt; so it will not break your application. That should not be a problem security-wise, but be aware that the body sent through the websocket is not sanitized by &lt;code&gt;str($body)-&amp;gt;sanitizeHtml()&lt;/code&gt; neither by AlpineJS.&lt;/p&gt;
&lt;p&gt;Basically, if your websocket server is compromised (or if you use a Public channel, I'm not sure): the attacker could send any HTML he wants in your DOM.&lt;/p&gt;
&lt;p&gt;If you don't use any HTML in your notification, change it to &lt;code&gt;x-text&lt;/code&gt; to be sure. Or read the last part of this article where I explain how to do even better by customizing even more Filament.&lt;/p&gt;
&lt;h2&gt;&lt;a id=&quot;content-how-can-we-do-more&quot; href=&quot;#content-how-can-we-do-more&quot; class=&quot;heading-permalink&quot; aria-hidden=&quot;true&quot; tabindex=&quot;-1&quot; title=&quot;Permalink&quot;&gt;#&lt;/a&gt;How can we do more?&lt;/h2&gt;
&lt;p&gt;I don't know what's on the roadmap of Filament v4 but I hope this feature will be included in the next release. Or at least I hope this article will push someone make a PR to Filament.&lt;/p&gt;
&lt;p&gt;I almost made a package of it but I don't think this version is worth it.&lt;/p&gt;
&lt;p&gt;If you are brave enough, here is a list of things I would do differently:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Support for database notifications: For now, only broadcasted notification support this feature but it should be easy enought to update the notification in the database.&lt;/li&gt;
&lt;li&gt;Add a new variable to mark the notification as updateable so they could be rebroadcasted if you open a new tab. Like a really persistent notification.&lt;/li&gt;
&lt;li&gt;Make a sub livewire component for each Notification to clean the code and have them listen to events dedicated to them. This will also help preventing XSS.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Hope you liked this article!&lt;/p&gt;</content>
        <author>
            <name>Eser DENIZ</name>
        </author>
    </entry>
    <entry>
        <title type="text">Review of my first time live streaming</title>
        <link href="https://srwiez.com/posts/review-of-my-first-time-live-streaming"/>
        <id>https://srwiez.com/posts/review-of-my-first-time-live-streaming</id>
        <published>2024-07-23T00:00:00+00:00</published>
        <updated>2024-07-23T17:30:26+00:00</updated>
        <summary type="text">&lt;p&gt;Today was my first time streaming live on internet. I wanted to livestream for a long long time. When I was gaming, when I was travelling and now while I'm coding.&lt;/p&gt;
&lt;!-- more --&gt;
&lt;p&gt;Several weeks ago I started looking to see how difficult it would be to do a live coding session. And after an hour of tinkering I was already up and running.&lt;/p&gt;
&lt;ul class=&quot;table-of-contents not-prose&quot;&gt;
&lt;li&gt;&lt;a href=&quot;#content-subject-of-the-stream&quot;&gt;Subject of the stream&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;#content-quick-look-at-the-setup&quot;&gt;Quick look at the setup&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;#content-the-good&quot;&gt;The good&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;#content-the-bad&quot;&gt;The bad&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;#content-the-ugly&quot;&gt;The ugly&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;#content-whats-next-&quot;&gt;What's next ?&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;&lt;a id=&quot;content-subject-of-the-stream&quot; href=&quot;#content-subject-of-the-stream&quot; class=&quot;heading-permalink&quot; aria-hidden=&quot;true&quot; tabindex=&quot;-1&quot; title=&quot;Permalink&quot;&gt;#&lt;/a&gt;Subject of the stream&lt;/h2&gt;
&lt;p&gt;I need a little menubar app to start and stop my VM installed on a Proxmox server. Right now I'm using &lt;code&gt;wakeonlan&lt;/code&gt; to start the server, wait several minutes, then I go to the web ui to start or stop each VM. Then after I'm done I shut down the server.&lt;/p&gt;
&lt;p&gt;I like the idea to have a dedicated app and I don't want to wait for the server to boot to start the VM.&lt;/p&gt;
&lt;p&gt;I want a user-friendly app I could upgrade with more features in the future.&lt;/p&gt;
&lt;h2&gt;&lt;a id=&quot;content-quick-look-at-the-setup&quot; href=&quot;#content-quick-look-at-the-setup&quot; class=&quot;heading-permalink&quot; aria-hidden=&quot;true&quot; tabindex=&quot;-1&quot; title=&quot;Permalink&quot;&gt;#&lt;/a&gt;Quick look at the setup&lt;/h2&gt;
&lt;p&gt;The hardware is pretty straight forward:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Computer&lt;/strong&gt;: MacBook Pro 2020 (i7, 16GB, 512GB)&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Camera&lt;/strong&gt;: iPhone 13 mini&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Microphone&lt;/strong&gt;: AirPods Pro&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;External monitor&lt;/strong&gt; to monitor the live and have the chat and other thing off-screen&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;For the software, I took the easy way:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Streaming software&lt;/strong&gt;: &lt;a href=&quot;https://obsproject.com/&quot;&gt;OBS&lt;/a&gt; for capturing the screen and the camera.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Streaming service&lt;/strong&gt;: &lt;a href=&quot;https://restream.io/&quot;&gt;Restream&lt;/a&gt; to stream to &lt;a href=&quot;https://www.twitch.tv/SRWieZ&quot;&gt;Twitch&lt;/a&gt;, &lt;a href=&quot;https://www.youtube.com/@SRWieZ&quot;&gt;YouTube&lt;/a&gt; and &lt;a href=&quot;https://twitter.com/SRWieZ&quot;&gt;Twitter&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;OBS plugin&lt;/strong&gt;: &lt;a href=&quot;https://github.com/FiniteSingularity/obs-composite-blur&quot;&gt;OBS Composite Blur&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;&lt;a id=&quot;content-the-good&quot; href=&quot;#content-the-good&quot; class=&quot;heading-permalink&quot; aria-hidden=&quot;true&quot; tabindex=&quot;-1&quot; title=&quot;Permalink&quot;&gt;#&lt;/a&gt;The good&lt;/h2&gt;
&lt;p&gt;OBS has come a long way! I followed the development by installing it from time to time, but I never really used it. It's &lt;strong&gt;easy&lt;/strong&gt; to use and &lt;strong&gt;powerful&lt;/strong&gt;. I was able to set up the stream in less than 20 minutes.&lt;/p&gt;
&lt;p&gt;I used a plugin to blur the screen when I knew passwords or other sensitive information would be displayed. With OBS you can put a shortcut on basically everything.&lt;/p&gt;
&lt;p&gt;For the next stream I want to repeat theses:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Using my iPhone as a camera was a good idea&lt;/strong&gt;. The quality is good and I can put it loosely somewhere on the desk It follows me. You can apply filters to the camera feed directly in MacOS (blurry background, studio light, etc..).&lt;/li&gt;
&lt;li&gt;Having a &lt;strong&gt;second monitor&lt;/strong&gt; was really helpful.&lt;/li&gt;
&lt;li&gt;I think that &lt;strong&gt;lowering my screen resolution&lt;/strong&gt; helped a lot with the performance and the clarity of the stream.&lt;/li&gt;
&lt;li&gt;Like expected, &lt;strong&gt;I was focused&lt;/strong&gt; on the app the whole time of the stream. It was one of my reasons to start streaming. I can be distracted easily and I wanted to force myself to be focused on the task at hand.&lt;/li&gt;
&lt;li&gt;Keep the minimum of apps open and &lt;strong&gt;turn on Focus mode&lt;/strong&gt; on MacOS.&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;&lt;a id=&quot;content-the-bad&quot; href=&quot;#content-the-bad&quot; class=&quot;heading-permalink&quot; aria-hidden=&quot;true&quot; tabindex=&quot;-1&quot; title=&quot;Permalink&quot;&gt;#&lt;/a&gt;The bad&lt;/h2&gt;
&lt;p&gt;And here is a list of things that went wrong and that I need to improve&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;It can be awkward for the viewers to have &lt;strong&gt;nothing happening on the screen while I'm doing something off-screen&lt;/strong&gt;. I tried to limit the use of the second screen when something was happening on the terminal for example. But sometimes I was reading the documentation off-screen and that's not good.&lt;/li&gt;
&lt;li&gt;The chat wouldn't stay on the screen. If OBS is not the active window, &lt;strong&gt;the chat disappears&lt;/strong&gt;. I need to find a way to keep it on the screen.&lt;/li&gt;
&lt;li&gt;I should probably hype the stream a little bit more. Because streaming live with &lt;strong&gt;no one watching&lt;/strong&gt; is a bit useless.&lt;/li&gt;
&lt;li&gt;I forgot to use &lt;strong&gt;Presentation Mode&lt;/strong&gt; on Phpstorm.&lt;/li&gt;
&lt;li&gt;I don't like seeing the Dock and the Menu bar on the stream. I should probably &lt;strong&gt;go fullscreen&lt;/strong&gt;.&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;&lt;a id=&quot;content-the-ugly&quot; href=&quot;#content-the-ugly&quot; class=&quot;heading-permalink&quot; aria-hidden=&quot;true&quot; tabindex=&quot;-1&quot; title=&quot;Permalink&quot;&gt;#&lt;/a&gt;The ugly&lt;/h2&gt;
&lt;p&gt;My MacBook Pro was &lt;strong&gt;really slow&lt;/strong&gt;! I already knew that it will blow up when I start streaming but didn't expect it to be that bad.&lt;/p&gt;
&lt;p&gt;It was so slow that every character I typed was displayed with a delay. &lt;strong&gt;Awful&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;PhpStorm was constantly indexing the project because it could not keep up with the changes. Composer and NPM were so slow that &lt;strong&gt;I was bored by my own stream&lt;/strong&gt;.&lt;/p&gt;
&lt;p&gt;My CPU had such a high load that some frames were dropped.&lt;/p&gt;
&lt;p&gt;The sound of the fan was so loud, it was really annoying. Don't think we can hear it on the stream thanks to the AirPods Pro.&lt;/p&gt;
&lt;p&gt;Bottom line, I have a performance problem.&lt;/p&gt;
&lt;h2&gt;&lt;a id=&quot;content-whats-next-&quot; href=&quot;#content-whats-next-&quot; class=&quot;heading-permalink&quot; aria-hidden=&quot;true&quot; tabindex=&quot;-1&quot; title=&quot;Permalink&quot;&gt;#&lt;/a&gt;What's next ?&lt;/h2&gt;
&lt;p&gt;I still want to livestream and since the app I'm building is very low priority I will continue to work on it during streams. This is a nice little project to share because I can easily explain what I'm doing along the way and can be valuable to some people.&lt;/p&gt;
&lt;p&gt;The question is how ? I was already aiming to buy a new Mac this fall. Maybe that's the solution. But I wonder, how do other streamers do it ?&lt;/p&gt;
&lt;p&gt;Is it a hardware problem ? A software problem ? A configuration problem ? I don't know. I will have to investigate.&lt;/p&gt;
&lt;p&gt;Anyway, if you know anything that could help me, please let me know. I'm all ears.&lt;/p&gt;</summary>
        <content type="html">&lt;p&gt;Today was my first time streaming live on internet. I wanted to livestream for a long long time. When I was gaming, when I was travelling and now while I'm coding.&lt;/p&gt;
&lt;!-- more --&gt;
&lt;p&gt;Several weeks ago I started looking to see how difficult it would be to do a live coding session. And after an hour of tinkering I was already up and running.&lt;/p&gt;
&lt;ul class=&quot;table-of-contents not-prose&quot;&gt;
&lt;li&gt;&lt;a href=&quot;#content-subject-of-the-stream&quot;&gt;Subject of the stream&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;#content-quick-look-at-the-setup&quot;&gt;Quick look at the setup&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;#content-the-good&quot;&gt;The good&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;#content-the-bad&quot;&gt;The bad&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;#content-the-ugly&quot;&gt;The ugly&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;#content-whats-next-&quot;&gt;What's next ?&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;&lt;a id=&quot;content-subject-of-the-stream&quot; href=&quot;#content-subject-of-the-stream&quot; class=&quot;heading-permalink&quot; aria-hidden=&quot;true&quot; tabindex=&quot;-1&quot; title=&quot;Permalink&quot;&gt;#&lt;/a&gt;Subject of the stream&lt;/h2&gt;
&lt;p&gt;I need a little menubar app to start and stop my VM installed on a Proxmox server. Right now I'm using &lt;code&gt;wakeonlan&lt;/code&gt; to start the server, wait several minutes, then I go to the web ui to start or stop each VM. Then after I'm done I shut down the server.&lt;/p&gt;
&lt;p&gt;I like the idea to have a dedicated app and I don't want to wait for the server to boot to start the VM.&lt;/p&gt;
&lt;p&gt;I want a user-friendly app I could upgrade with more features in the future.&lt;/p&gt;
&lt;h2&gt;&lt;a id=&quot;content-quick-look-at-the-setup&quot; href=&quot;#content-quick-look-at-the-setup&quot; class=&quot;heading-permalink&quot; aria-hidden=&quot;true&quot; tabindex=&quot;-1&quot; title=&quot;Permalink&quot;&gt;#&lt;/a&gt;Quick look at the setup&lt;/h2&gt;
&lt;p&gt;The hardware is pretty straight forward:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Computer&lt;/strong&gt;: MacBook Pro 2020 (i7, 16GB, 512GB)&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Camera&lt;/strong&gt;: iPhone 13 mini&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Microphone&lt;/strong&gt;: AirPods Pro&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;External monitor&lt;/strong&gt; to monitor the live and have the chat and other thing off-screen&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;For the software, I took the easy way:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Streaming software&lt;/strong&gt;: &lt;a href=&quot;https://obsproject.com/&quot;&gt;OBS&lt;/a&gt; for capturing the screen and the camera.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Streaming service&lt;/strong&gt;: &lt;a href=&quot;https://restream.io/&quot;&gt;Restream&lt;/a&gt; to stream to &lt;a href=&quot;https://www.twitch.tv/SRWieZ&quot;&gt;Twitch&lt;/a&gt;, &lt;a href=&quot;https://www.youtube.com/@SRWieZ&quot;&gt;YouTube&lt;/a&gt; and &lt;a href=&quot;https://twitter.com/SRWieZ&quot;&gt;Twitter&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;OBS plugin&lt;/strong&gt;: &lt;a href=&quot;https://github.com/FiniteSingularity/obs-composite-blur&quot;&gt;OBS Composite Blur&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;&lt;a id=&quot;content-the-good&quot; href=&quot;#content-the-good&quot; class=&quot;heading-permalink&quot; aria-hidden=&quot;true&quot; tabindex=&quot;-1&quot; title=&quot;Permalink&quot;&gt;#&lt;/a&gt;The good&lt;/h2&gt;
&lt;p&gt;OBS has come a long way! I followed the development by installing it from time to time, but I never really used it. It's &lt;strong&gt;easy&lt;/strong&gt; to use and &lt;strong&gt;powerful&lt;/strong&gt;. I was able to set up the stream in less than 20 minutes.&lt;/p&gt;
&lt;p&gt;I used a plugin to blur the screen when I knew passwords or other sensitive information would be displayed. With OBS you can put a shortcut on basically everything.&lt;/p&gt;
&lt;p&gt;For the next stream I want to repeat theses:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Using my iPhone as a camera was a good idea&lt;/strong&gt;. The quality is good and I can put it loosely somewhere on the desk It follows me. You can apply filters to the camera feed directly in MacOS (blurry background, studio light, etc..).&lt;/li&gt;
&lt;li&gt;Having a &lt;strong&gt;second monitor&lt;/strong&gt; was really helpful.&lt;/li&gt;
&lt;li&gt;I think that &lt;strong&gt;lowering my screen resolution&lt;/strong&gt; helped a lot with the performance and the clarity of the stream.&lt;/li&gt;
&lt;li&gt;Like expected, &lt;strong&gt;I was focused&lt;/strong&gt; on the app the whole time of the stream. It was one of my reasons to start streaming. I can be distracted easily and I wanted to force myself to be focused on the task at hand.&lt;/li&gt;
&lt;li&gt;Keep the minimum of apps open and &lt;strong&gt;turn on Focus mode&lt;/strong&gt; on MacOS.&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;&lt;a id=&quot;content-the-bad&quot; href=&quot;#content-the-bad&quot; class=&quot;heading-permalink&quot; aria-hidden=&quot;true&quot; tabindex=&quot;-1&quot; title=&quot;Permalink&quot;&gt;#&lt;/a&gt;The bad&lt;/h2&gt;
&lt;p&gt;And here is a list of things that went wrong and that I need to improve&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;It can be awkward for the viewers to have &lt;strong&gt;nothing happening on the screen while I'm doing something off-screen&lt;/strong&gt;. I tried to limit the use of the second screen when something was happening on the terminal for example. But sometimes I was reading the documentation off-screen and that's not good.&lt;/li&gt;
&lt;li&gt;The chat wouldn't stay on the screen. If OBS is not the active window, &lt;strong&gt;the chat disappears&lt;/strong&gt;. I need to find a way to keep it on the screen.&lt;/li&gt;
&lt;li&gt;I should probably hype the stream a little bit more. Because streaming live with &lt;strong&gt;no one watching&lt;/strong&gt; is a bit useless.&lt;/li&gt;
&lt;li&gt;I forgot to use &lt;strong&gt;Presentation Mode&lt;/strong&gt; on Phpstorm.&lt;/li&gt;
&lt;li&gt;I don't like seeing the Dock and the Menu bar on the stream. I should probably &lt;strong&gt;go fullscreen&lt;/strong&gt;.&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;&lt;a id=&quot;content-the-ugly&quot; href=&quot;#content-the-ugly&quot; class=&quot;heading-permalink&quot; aria-hidden=&quot;true&quot; tabindex=&quot;-1&quot; title=&quot;Permalink&quot;&gt;#&lt;/a&gt;The ugly&lt;/h2&gt;
&lt;p&gt;My MacBook Pro was &lt;strong&gt;really slow&lt;/strong&gt;! I already knew that it will blow up when I start streaming but didn't expect it to be that bad.&lt;/p&gt;
&lt;p&gt;It was so slow that every character I typed was displayed with a delay. &lt;strong&gt;Awful&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;PhpStorm was constantly indexing the project because it could not keep up with the changes. Composer and NPM were so slow that &lt;strong&gt;I was bored by my own stream&lt;/strong&gt;.&lt;/p&gt;
&lt;p&gt;My CPU had such a high load that some frames were dropped.&lt;/p&gt;
&lt;p&gt;The sound of the fan was so loud, it was really annoying. Don't think we can hear it on the stream thanks to the AirPods Pro.&lt;/p&gt;
&lt;p&gt;Bottom line, I have a performance problem.&lt;/p&gt;
&lt;h2&gt;&lt;a id=&quot;content-whats-next-&quot; href=&quot;#content-whats-next-&quot; class=&quot;heading-permalink&quot; aria-hidden=&quot;true&quot; tabindex=&quot;-1&quot; title=&quot;Permalink&quot;&gt;#&lt;/a&gt;What's next ?&lt;/h2&gt;
&lt;p&gt;I still want to livestream and since the app I'm building is very low priority I will continue to work on it during streams. This is a nice little project to share because I can easily explain what I'm doing along the way and can be valuable to some people.&lt;/p&gt;
&lt;p&gt;The question is how ? I was already aiming to buy a new Mac this fall. Maybe that's the solution. But I wonder, how do other streamers do it ?&lt;/p&gt;
&lt;p&gt;Is it a hardware problem ? A software problem ? A configuration problem ? I don't know. I will have to investigate.&lt;/p&gt;
&lt;p&gt;Anyway, if you know anything that could help me, please let me know. I'm all ears.&lt;/p&gt;</content>
        <author>
            <name>Eser DENIZ</name>
        </author>
    </entry>
    <entry>
        <title type="text">How I organise my notes in 2024</title>
        <link href="https://srwiez.com/posts/how-i-organise-my-notes-in-2024"/>
        <id>https://srwiez.com/posts/how-i-organise-my-notes-in-2024</id>
        <published>2024-07-17T00:00:00+00:00</published>
        <updated>2024-07-17T10:36:01+00:00</updated>
        <summary type="text">&lt;p&gt;My notes always seemed messy, even to me. And then I realized they are actually organized in a certain way that pleases my brain.&lt;/p&gt;
&lt;!--more--&gt;
&lt;p&gt;Everyone is searching for the perfect notes app, the ONE notes app that will rule them all. But for me, and for as long as I can remember, I always had several different apps. In my Android days, I had 3 notes apps on my phone that had the same exact features.&lt;/p&gt;
&lt;p&gt;Why, you ask? Because I like to put similar thoughts into their own boxes. This way my brain knows in which box to look when I need to find a thought on a certain subject.&lt;/p&gt;
&lt;p&gt;Every thought has its place in a different app, and here is my system.&lt;/p&gt;
&lt;ul class=&quot;table-of-contents not-prose&quot;&gt;
&lt;li&gt;&lt;a href=&quot;#content-project-ideas&quot;&gt;Project Ideas&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;#content-open-source-package&quot;&gt;Open Source Package&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;#content-tasks-on-a-big-project&quot;&gt;Tasks on a Big Project&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;#content-blog-posts&quot;&gt;Blog Posts&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;#content-everything-else&quot;&gt;Everything Else&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;#content-conclusion&quot;&gt;Conclusion&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;&lt;a id=&quot;content-project-ideas&quot; href=&quot;#content-project-ideas&quot; class=&quot;heading-permalink&quot; aria-hidden=&quot;true&quot; tabindex=&quot;-1&quot; title=&quot;Permalink&quot;&gt;#&lt;/a&gt;Project Ideas&lt;/h3&gt;
&lt;p&gt;I have a lot of ideas. More than I can or will code in my life. And for most of my life, I just put those ideas everywhere. In a .txt file on my desktop, on my notepad, on my phone. Literally everywhere.&lt;/p&gt;
&lt;p&gt;Last year I decided to organize them because it became overwhelming to have so many ideas. I also discovered some nice old ideas I had totally forgotten about on an old disk.&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;https://aschmelyun.com/blog/the-crippling-problem-of-being-able-to-build-whatever-you-want/&quot;&gt;This article&lt;/a&gt; from Andrew Schmelyun helped me find a system to organize my code projects and ideas.&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;I have four columns for my ideas: Backlog, Promising, Working On, Monitoring, and Archived. If I think of an idea, I create a new card in the Backlog and dump as much info as I can into it. Framework to use, pain points that I could encounter, potential domain names, you get the picture.&lt;/p&gt;
&lt;p&gt;Then, I do nothing.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;Basically, I use Trello to organize my ongoing and future projects into columns. Unlike Andrew, I put the minimum information there: just a name or a sentence.&lt;/p&gt;
&lt;p&gt;If the idea is growing in my head with some details it should include or a tech stack it should use: I put these additional notes in Apple Notes in a directory named &lt;strong&gt;Projects&lt;/strong&gt; where there is only one note per project.&lt;/p&gt;
&lt;p&gt;And that's it.&lt;/p&gt;
&lt;h3&gt;&lt;a id=&quot;content-open-source-package&quot; href=&quot;#content-open-source-package&quot; class=&quot;heading-permalink&quot; aria-hidden=&quot;true&quot; tabindex=&quot;-1&quot; title=&quot;Permalink&quot;&gt;#&lt;/a&gt;Open Source Package&lt;/h3&gt;
&lt;p&gt;I don't have that many &lt;a href=&quot;https://srwiez.com/open-source&quot;&gt;open source&lt;/a&gt; projects, or should I say not big enough ones. In a livestream, I saw &lt;a href=&quot;https://x.com/brendt_gd&quot;&gt;Brendt&lt;/a&gt; using Github Issues as notes for his projects, &lt;a href=&quot;https://tempestphp.com&quot;&gt;checkout tempest framework&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;And I think it's the best place to put those bugs &amp;amp; ideas: next to the package.&lt;/p&gt;
&lt;h3&gt;&lt;a id=&quot;content-tasks-on-a-big-project&quot; href=&quot;#content-tasks-on-a-big-project&quot; class=&quot;heading-permalink&quot; aria-hidden=&quot;true&quot; tabindex=&quot;-1&quot; title=&quot;Permalink&quot;&gt;#&lt;/a&gt;Tasks on a Big Project&lt;/h3&gt;
&lt;p&gt;If you don't know, my biggest project in progress is &lt;a href=&quot;https://unolia.com&quot;&gt;unolia.com&lt;/a&gt; where I'm making the best place to manage your domains.&lt;/p&gt;
&lt;p&gt;My notes are separated into two places:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;If I'm working on a feature and I need to dump new ideas on paper: Apple Notes. Because it's the fastest way to get back some RAM in my head!&lt;/li&gt;
&lt;li&gt;If I have more than 5 seconds: &lt;a href=&quot;https://linear.app&quot;&gt;Linear&lt;/a&gt;. Everything is eventually put there. I use priority sometimes to find important tasks at a glance. But most importantly, I use cycles to remember to take breaks and to take a step back.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Sometimes I also use TODO comments in my code. Either because I need to remember to do this before committing and if I forget Phpstorm will tell me just before. Or either because I intend to rewrite or refactor something later and it makes sense to put this note next to the concerned code.&lt;/p&gt;
&lt;h3&gt;&lt;a id=&quot;content-blog-posts&quot; href=&quot;#content-blog-posts&quot; class=&quot;heading-permalink&quot; aria-hidden=&quot;true&quot; tabindex=&quot;-1&quot; title=&quot;Permalink&quot;&gt;#&lt;/a&gt;Blog Posts&lt;/h3&gt;
&lt;p&gt;An easy one, every time I have a blog post idea, I just create a draft.&lt;/p&gt;
&lt;p&gt;Sometimes I never write the article, sometimes I write it a year later, and sometimes, being on the admin panel of my blog pushes me to write it now.&lt;/p&gt;
&lt;p&gt;I use to note how-to tutorials when I learn something new. It's cool because when I try to recreate something I did before, I know I have a tutorial ready here. Most of the time, I put the article online when I need to reuse my article. By having to read it again, it gives me the motivation to finish it with examples and screenshots so it can be useful to others.&lt;/p&gt;
&lt;h3&gt;&lt;a id=&quot;content-everything-else&quot; href=&quot;#content-everything-else&quot; class=&quot;heading-permalink&quot; aria-hidden=&quot;true&quot; tabindex=&quot;-1&quot; title=&quot;Permalink&quot;&gt;#&lt;/a&gt;Everything Else&lt;/h3&gt;
&lt;p&gt;For the rest: Notes on my phone (and my Mac). It's synced between my devices. I have some directories to separate different subjects: project, personal, unolia.com, etc.&lt;/p&gt;
&lt;h3&gt;&lt;a id=&quot;content-conclusion&quot; href=&quot;#content-conclusion&quot; class=&quot;heading-permalink&quot; aria-hidden=&quot;true&quot; tabindex=&quot;-1&quot; title=&quot;Permalink&quot;&gt;#&lt;/a&gt;Conclusion&lt;/h3&gt;
&lt;p&gt;The short version of this article is: put your notes where they belong.&lt;/p&gt;
&lt;p&gt;I'm not saying you should use my system. I'm sure it doesn't work for a lot of you but I wanted to share mine because I had one for years and I just didn't notice. Hope you found this article interesting!&lt;/p&gt;</summary>
        <content type="html">&lt;p&gt;My notes always seemed messy, even to me. And then I realized they are actually organized in a certain way that pleases my brain.&lt;/p&gt;
&lt;!--more--&gt;
&lt;p&gt;Everyone is searching for the perfect notes app, the ONE notes app that will rule them all. But for me, and for as long as I can remember, I always had several different apps. In my Android days, I had 3 notes apps on my phone that had the same exact features.&lt;/p&gt;
&lt;p&gt;Why, you ask? Because I like to put similar thoughts into their own boxes. This way my brain knows in which box to look when I need to find a thought on a certain subject.&lt;/p&gt;
&lt;p&gt;Every thought has its place in a different app, and here is my system.&lt;/p&gt;
&lt;ul class=&quot;table-of-contents not-prose&quot;&gt;
&lt;li&gt;&lt;a href=&quot;#content-project-ideas&quot;&gt;Project Ideas&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;#content-open-source-package&quot;&gt;Open Source Package&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;#content-tasks-on-a-big-project&quot;&gt;Tasks on a Big Project&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;#content-blog-posts&quot;&gt;Blog Posts&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;#content-everything-else&quot;&gt;Everything Else&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;#content-conclusion&quot;&gt;Conclusion&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;&lt;a id=&quot;content-project-ideas&quot; href=&quot;#content-project-ideas&quot; class=&quot;heading-permalink&quot; aria-hidden=&quot;true&quot; tabindex=&quot;-1&quot; title=&quot;Permalink&quot;&gt;#&lt;/a&gt;Project Ideas&lt;/h3&gt;
&lt;p&gt;I have a lot of ideas. More than I can or will code in my life. And for most of my life, I just put those ideas everywhere. In a .txt file on my desktop, on my notepad, on my phone. Literally everywhere.&lt;/p&gt;
&lt;p&gt;Last year I decided to organize them because it became overwhelming to have so many ideas. I also discovered some nice old ideas I had totally forgotten about on an old disk.&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;https://aschmelyun.com/blog/the-crippling-problem-of-being-able-to-build-whatever-you-want/&quot;&gt;This article&lt;/a&gt; from Andrew Schmelyun helped me find a system to organize my code projects and ideas.&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;I have four columns for my ideas: Backlog, Promising, Working On, Monitoring, and Archived. If I think of an idea, I create a new card in the Backlog and dump as much info as I can into it. Framework to use, pain points that I could encounter, potential domain names, you get the picture.&lt;/p&gt;
&lt;p&gt;Then, I do nothing.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;Basically, I use Trello to organize my ongoing and future projects into columns. Unlike Andrew, I put the minimum information there: just a name or a sentence.&lt;/p&gt;
&lt;p&gt;If the idea is growing in my head with some details it should include or a tech stack it should use: I put these additional notes in Apple Notes in a directory named &lt;strong&gt;Projects&lt;/strong&gt; where there is only one note per project.&lt;/p&gt;
&lt;p&gt;And that's it.&lt;/p&gt;
&lt;h3&gt;&lt;a id=&quot;content-open-source-package&quot; href=&quot;#content-open-source-package&quot; class=&quot;heading-permalink&quot; aria-hidden=&quot;true&quot; tabindex=&quot;-1&quot; title=&quot;Permalink&quot;&gt;#&lt;/a&gt;Open Source Package&lt;/h3&gt;
&lt;p&gt;I don't have that many &lt;a href=&quot;https://srwiez.com/open-source&quot;&gt;open source&lt;/a&gt; projects, or should I say not big enough ones. In a livestream, I saw &lt;a href=&quot;https://x.com/brendt_gd&quot;&gt;Brendt&lt;/a&gt; using Github Issues as notes for his projects, &lt;a href=&quot;https://tempestphp.com&quot;&gt;checkout tempest framework&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;And I think it's the best place to put those bugs &amp;amp; ideas: next to the package.&lt;/p&gt;
&lt;h3&gt;&lt;a id=&quot;content-tasks-on-a-big-project&quot; href=&quot;#content-tasks-on-a-big-project&quot; class=&quot;heading-permalink&quot; aria-hidden=&quot;true&quot; tabindex=&quot;-1&quot; title=&quot;Permalink&quot;&gt;#&lt;/a&gt;Tasks on a Big Project&lt;/h3&gt;
&lt;p&gt;If you don't know, my biggest project in progress is &lt;a href=&quot;https://unolia.com&quot;&gt;unolia.com&lt;/a&gt; where I'm making the best place to manage your domains.&lt;/p&gt;
&lt;p&gt;My notes are separated into two places:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;If I'm working on a feature and I need to dump new ideas on paper: Apple Notes. Because it's the fastest way to get back some RAM in my head!&lt;/li&gt;
&lt;li&gt;If I have more than 5 seconds: &lt;a href=&quot;https://linear.app&quot;&gt;Linear&lt;/a&gt;. Everything is eventually put there. I use priority sometimes to find important tasks at a glance. But most importantly, I use cycles to remember to take breaks and to take a step back.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Sometimes I also use TODO comments in my code. Either because I need to remember to do this before committing and if I forget Phpstorm will tell me just before. Or either because I intend to rewrite or refactor something later and it makes sense to put this note next to the concerned code.&lt;/p&gt;
&lt;h3&gt;&lt;a id=&quot;content-blog-posts&quot; href=&quot;#content-blog-posts&quot; class=&quot;heading-permalink&quot; aria-hidden=&quot;true&quot; tabindex=&quot;-1&quot; title=&quot;Permalink&quot;&gt;#&lt;/a&gt;Blog Posts&lt;/h3&gt;
&lt;p&gt;An easy one, every time I have a blog post idea, I just create a draft.&lt;/p&gt;
&lt;p&gt;Sometimes I never write the article, sometimes I write it a year later, and sometimes, being on the admin panel of my blog pushes me to write it now.&lt;/p&gt;
&lt;p&gt;I use to note how-to tutorials when I learn something new. It's cool because when I try to recreate something I did before, I know I have a tutorial ready here. Most of the time, I put the article online when I need to reuse my article. By having to read it again, it gives me the motivation to finish it with examples and screenshots so it can be useful to others.&lt;/p&gt;
&lt;h3&gt;&lt;a id=&quot;content-everything-else&quot; href=&quot;#content-everything-else&quot; class=&quot;heading-permalink&quot; aria-hidden=&quot;true&quot; tabindex=&quot;-1&quot; title=&quot;Permalink&quot;&gt;#&lt;/a&gt;Everything Else&lt;/h3&gt;
&lt;p&gt;For the rest: Notes on my phone (and my Mac). It's synced between my devices. I have some directories to separate different subjects: project, personal, unolia.com, etc.&lt;/p&gt;
&lt;h3&gt;&lt;a id=&quot;content-conclusion&quot; href=&quot;#content-conclusion&quot; class=&quot;heading-permalink&quot; aria-hidden=&quot;true&quot; tabindex=&quot;-1&quot; title=&quot;Permalink&quot;&gt;#&lt;/a&gt;Conclusion&lt;/h3&gt;
&lt;p&gt;The short version of this article is: put your notes where they belong.&lt;/p&gt;
&lt;p&gt;I'm not saying you should use my system. I'm sure it doesn't work for a lot of you but I wanted to share mine because I had one for years and I just didn't notice. Hope you found this article interesting!&lt;/p&gt;</content>
        <author>
            <name>Eser DENIZ</name>
        </author>
    </entry>
    <entry>
        <title type="text">Help your users verify their email with Sniper Link</title>
        <link href="https://srwiez.com/posts/help-your-users-verify-their-email-with-sniper-link"/>
        <id>https://srwiez.com/posts/help-your-users-verify-their-email-with-sniper-link</id>
        <published>2024-04-19T00:00:00+00:00</published>
        <updated>2024-04-25T16:24:09+00:00</updated>
        <summary type="text">&lt;p&gt;Hey! I discovered this tool while using &lt;a href=&quot;https://mailcoach.app&quot;&gt;Mailcoach&lt;/a&gt; and I think it's very useful. May I introduce &lt;a href=&quot;https://sniperl.ink&quot;&gt;Sniper link&lt;/a&gt;, a little javascript tool showing a button that directly opens the user’s email client.&lt;/p&gt;
&lt;!--more--&gt;
&lt;div style=&quot;text-align:center;&quot;&gt;
&lt;img style=&quot;display:inline-block;&quot; alt=&quot;example&quot; src=&quot;https://assets.srwiez.com/sniperlink/8e036701-3d09-47c9-99f5-30ffda15ea28.png&quot;/&gt;
&lt;/div
&lt;p&gt;Here is an example of implementing it in Laravel Fortify, find &lt;strong&gt;verify-email.blade.php&lt;/strong&gt;, and add the following code&lt;/p&gt;
&lt;div x-data=&quot;codeBlock&quot; class=&quot;code-block relative&quot;&gt;&lt;div class=&quot;flex space-x-2 items-center absolute top-0 right-0&quot;&gt;
    &lt;div x-cloak x-show=&quot;showMessage&quot; x-transition class=&quot;py-2 animate-bounce transition duration-300 mt-1 text-sky-500 text-xs&quot;&gt;Copied!&lt;/div&gt;
    &lt;button
        type=&quot;button&quot;
        title=&quot;Copy to clipboard&quot;
        class=&quot;hidden sm:block p-2 pl-3 transition duration-300&quot;
        @click.prevent=&quot;copyToClipboard&quot;
        :class=&quot;{
            'text-black/30 hover:text-black/80': !showMessage,
            'text-sky-500 hover:text-sky-700': showMessage,
        }&quot;&gt;
        &lt;svg xmlns=&quot;http://www.w3.org/2000/svg&quot; fill=&quot;none&quot; viewBox=&quot;0 0 24 24&quot; stroke-width=&quot;1.5&quot; stroke=&quot;currentColor&quot; class=&quot;block w-6 h-6&quot;&gt;
            &lt;path fill=&quot;white&quot; stroke-linecap=&quot;round&quot; stroke-linejoin=&quot;round&quot; d=&quot;M11.35 3.836c-.065.21-.1.433-.1.664 0 .414.336.75.75.75h4.5a.75.75 0 00.75-.75 2.25 2.25 0 00-.1-.664m-5.8 0A2.251 2.251 0 0113.5 2.25H15c1.012 0 1.867.668 2.15 1.586m-5.8 0c-.376.023-.75.05-1.124.08C9.095 4.01 8.25 4.973 8.25 6.108V8.25m8.9-4.414c.376.023.75.05 1.124.08 1.131.094 1.976 1.057 1.976 2.192V16.5A2.25 2.25 0 0118 18.75h-2.25m-7.5-10.5H4.875c-.621 0-1.125.504-1.125 1.125v11.25c0 .621.504 1.125 1.125 1.125h9.75c.621 0 1.125-.504 1.125-1.125V18.75m-7.5-10.5h6.375c.621 0 1.125.504 1.125 1.125v9.375m-8.25-3l1.5 1.5 3-3.75&quot; /&gt;
        &lt;/svg&gt;
    &lt;/button&gt;
&lt;/div&gt;&lt;pre class=&quot;phiki language-blade github-light&quot; data-language=&quot;blade&quot; style=&quot;background-color: #fff;color: #24292e;--phiki-line-highlight: #f6f8fa;&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;token&quot;&gt;&amp;lt;&lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #22863a;&quot;&gt;x-guest-layout&lt;/span&gt;&lt;span class=&quot;token&quot;&gt;&amp;gt;&lt;/span&gt;&lt;span class=&quot;token&quot;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;token&quot;&gt;    &lt;/span&gt;&lt;span class=&quot;token&quot;&gt;&amp;lt;&lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #22863a;&quot;&gt;x-authentication-card&lt;/span&gt;&lt;span class=&quot;token&quot;&gt;&amp;gt;&lt;/span&gt;&lt;span class=&quot;token&quot;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;token&quot;&gt;        &lt;/span&gt;&lt;span class=&quot;token&quot;&gt;&amp;lt;&lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #22863a;&quot;&gt;x-slot&lt;/span&gt;&lt;span class=&quot;token&quot;&gt; &lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #6f42c1;&quot;&gt;name&lt;/span&gt;&lt;span class=&quot;token&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #032f62;&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #032f62;&quot;&gt;logo&lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #032f62;&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span class=&quot;token&quot;&gt;&amp;gt;&lt;/span&gt;&lt;span class=&quot;token&quot;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;token&quot;&gt;            &lt;/span&gt;&lt;span class=&quot;token&quot;&gt;&amp;lt;&lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #22863a;&quot;&gt;x-authentication-card-logo&lt;/span&gt;&lt;span class=&quot;token&quot;&gt;/&amp;gt;&lt;/span&gt;&lt;span class=&quot;token&quot;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;token&quot;&gt;        &lt;/span&gt;&lt;span class=&quot;token&quot;&gt;&amp;lt;/&lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #22863a;&quot;&gt;x-slot&lt;/span&gt;&lt;span class=&quot;token&quot;&gt;&amp;gt;&lt;/span&gt;&lt;span class=&quot;token&quot;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;token&quot;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;token&quot;&gt;        &lt;/span&gt;&lt;span class=&quot;token&quot;&gt;&amp;lt;&lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #22863a;&quot;&gt;div&lt;/span&gt;&lt;span class=&quot;token&quot;&gt; &lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #6f42c1;&quot;&gt;class&lt;/span&gt;&lt;span class=&quot;token&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #032f62;&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #032f62;&quot;&gt;mb-4 text-sm text-gray-600&lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #032f62;&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span class=&quot;token&quot;&gt;&amp;gt;&lt;/span&gt;&lt;span class=&quot;token&quot;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;token&quot;&gt;            &lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #005cc5;&quot;&gt;{{&lt;/span&gt;&lt;span class=&quot;token&quot;&gt; &lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #6f42c1;&quot;&gt;__&lt;/span&gt;&lt;span class=&quot;token&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #032f62;&quot;&gt;&amp;#039;&lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #032f62;&quot;&gt;Before continuing, could you verify your email address by clicking on the link we just emailed to you? If you didn&lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #005cc5;&quot;&gt;\&amp;#039;&lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #032f62;&quot;&gt;t receive the email, we will gladly send you another.&lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #032f62;&quot;&gt;&amp;#039;&lt;/span&gt;&lt;span class=&quot;token&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token&quot;&gt; &lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #005cc5;&quot;&gt;}}&lt;/span&gt;&lt;span class=&quot;token&quot;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;token&quot;&gt;        &lt;/span&gt;&lt;span class=&quot;token&quot;&gt;&amp;lt;/&lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #22863a;&quot;&gt;div&lt;/span&gt;&lt;span class=&quot;token&quot;&gt;&amp;gt;&lt;/span&gt;&lt;span class=&quot;token&quot;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;token&quot;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;token&quot;&gt;        &lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #d73a49;&quot;&gt;@if &lt;/span&gt;&lt;span class=&quot;token&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #6f42c1;&quot;&gt;session&lt;/span&gt;&lt;span class=&quot;token&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #032f62;&quot;&gt;&amp;#039;&lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #032f62;&quot;&gt;status&lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #032f62;&quot;&gt;&amp;#039;&lt;/span&gt;&lt;span class=&quot;token&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token&quot;&gt; &lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #d73a49;&quot;&gt;==&lt;/span&gt;&lt;span class=&quot;token&quot;&gt; &lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #032f62;&quot;&gt;&amp;#039;&lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #032f62;&quot;&gt;verification-link-sent&lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #032f62;&quot;&gt;&amp;#039;&lt;/span&gt;&lt;span class=&quot;token&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token&quot;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;token&quot;&gt;            &lt;/span&gt;&lt;span class=&quot;token&quot;&gt;&amp;lt;&lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #22863a;&quot;&gt;div&lt;/span&gt;&lt;span class=&quot;token&quot;&gt; &lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #6f42c1;&quot;&gt;class&lt;/span&gt;&lt;span class=&quot;token&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #032f62;&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #032f62;&quot;&gt;mb-4 font-medium text-sm text-green-600&lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #032f62;&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span class=&quot;token&quot;&gt;&amp;gt;&lt;/span&gt;&lt;span class=&quot;token&quot;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;token&quot;&gt;                &lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #005cc5;&quot;&gt;{{&lt;/span&gt;&lt;span class=&quot;token&quot;&gt; &lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #6f42c1;&quot;&gt;__&lt;/span&gt;&lt;span class=&quot;token&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #032f62;&quot;&gt;&amp;#039;&lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #032f62;&quot;&gt;A new verification link has been sent to the email address you provided in your profile settings.&lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #032f62;&quot;&gt;&amp;#039;&lt;/span&gt;&lt;span class=&quot;token&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token&quot;&gt; &lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #005cc5;&quot;&gt;}}&lt;/span&gt;&lt;span class=&quot;token&quot;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;token&quot;&gt;            &lt;/span&gt;&lt;span class=&quot;token&quot;&gt;&amp;lt;/&lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #22863a;&quot;&gt;div&lt;/span&gt;&lt;span class=&quot;token&quot;&gt;&amp;gt;&lt;/span&gt;&lt;span class=&quot;token&quot;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;token&quot;&gt;        &lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #d73a49;&quot;&gt;@endif&lt;/span&gt;&lt;span class=&quot;token&quot;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;line highlight&quot;&gt;&lt;span class=&quot;token&quot;&gt;        &lt;/span&gt;&lt;span class=&quot;token&quot;&gt;&amp;lt;&lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #22863a;&quot;&gt;div&lt;/span&gt;&lt;span class=&quot;token&quot;&gt; &lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #6f42c1;&quot;&gt;class&lt;/span&gt;&lt;span class=&quot;token&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #032f62;&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #032f62;&quot;&gt;flex items-center justify-around min-h-14&lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #032f62;&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span class=&quot;token&quot;&gt;&amp;gt;&lt;/span&gt;&lt;span class=&quot;token&quot;&gt; 
&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;line highlight&quot;&gt;&lt;span class=&quot;token&quot;&gt;            &lt;/span&gt;&lt;span class=&quot;token&quot;&gt;&amp;lt;&lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #22863a;&quot;&gt;sniper-link&lt;/span&gt;&lt;span class=&quot;token&quot;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;line highlight&quot;&gt;&lt;span class=&quot;token&quot;&gt;                &lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #6f42c1;&quot;&gt;recipient&lt;/span&gt;&lt;span class=&quot;token&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #032f62;&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #005cc5;&quot;&gt;{{&lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #032f62;&quot;&gt; &lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #6f42c1;&quot;&gt;auth&lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #032f62;&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #032f62;&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #d73a49;&quot;&gt;-&amp;gt;&lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #6f42c1;&quot;&gt;user&lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #032f62;&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #032f62;&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #d73a49;&quot;&gt;-&amp;gt;&lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #24292e;&quot;&gt;email&lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #032f62;&quot;&gt; &lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #005cc5;&quot;&gt;}}&lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #032f62;&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span class=&quot;token&quot;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;line highlight&quot;&gt;&lt;span class=&quot;token&quot;&gt;                &lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #6f42c1;&quot;&gt;sender&lt;/span&gt;&lt;span class=&quot;token&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #032f62;&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #005cc5;&quot;&gt;{{&lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #032f62;&quot;&gt; &lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #6f42c1;&quot;&gt;config&lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #032f62;&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #032f62;&quot;&gt;&amp;#039;&lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #032f62;&quot;&gt;mail.from.address&lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #032f62;&quot;&gt;&amp;#039;&lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #032f62;&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #032f62;&quot;&gt; &lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #005cc5;&quot;&gt;}}&lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #032f62;&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span class=&quot;token&quot;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;line highlight&quot;&gt;&lt;span class=&quot;token&quot;&gt;                &lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #6f42c1;&quot;&gt;template&lt;/span&gt;&lt;span class=&quot;token&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #032f62;&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #032f62;&quot;&gt;Check my emails on {provider}&lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #032f62;&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span class=&quot;token&quot;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;line highlight&quot;&gt;&lt;span class=&quot;token&quot;&gt;            &lt;/span&gt;&lt;span class=&quot;token&quot;&gt;/&amp;gt;&lt;/span&gt;&lt;span class=&quot;token&quot;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;line highlight&quot;&gt;&lt;span class=&quot;token&quot;&gt;            &lt;/span&gt;&lt;span class=&quot;token&quot;&gt;&amp;lt;&lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #22863a;&quot;&gt;script&lt;/span&gt;&lt;span class=&quot;token&quot;&gt; &lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #6f42c1;&quot;&gt;src&lt;/span&gt;&lt;span class=&quot;token&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #032f62;&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #032f62;&quot;&gt;https://sniperl.ink/v1/sniper-link.js&lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #032f62;&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span class=&quot;token&quot;&gt; &lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #6f42c1;&quot;&gt;defer&lt;/span&gt;&lt;span class=&quot;token&quot;&gt;&amp;gt;&lt;/span&gt;&lt;span class=&quot;token&quot;&gt;&amp;lt;&lt;/span&gt;&lt;span class=&quot;token&quot;&gt;/&lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #22863a;&quot;&gt;script&lt;/span&gt;&lt;span class=&quot;token&quot;&gt;&amp;gt;&lt;/span&gt;&lt;span class=&quot;token&quot;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;line highlight&quot;&gt;&lt;span class=&quot;token&quot;&gt;        &lt;/span&gt;&lt;span class=&quot;token&quot;&gt;&amp;lt;/&lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #22863a;&quot;&gt;div&lt;/span&gt;&lt;span class=&quot;token&quot;&gt;&amp;gt;&lt;/span&gt;&lt;span class=&quot;token&quot;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;token&quot;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;token&quot;&gt;        &lt;/span&gt;&lt;span class=&quot;token&quot;&gt;&amp;lt;&lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #22863a;&quot;&gt;div&lt;/span&gt;&lt;span class=&quot;token&quot;&gt; &lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #6f42c1;&quot;&gt;class&lt;/span&gt;&lt;span class=&quot;token&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #032f62;&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #032f62;&quot;&gt;mt-4 flex items-center justify-between&lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #032f62;&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span class=&quot;token&quot;&gt;&amp;gt;&lt;/span&gt;&lt;span class=&quot;token&quot;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;token&quot;&gt;            &lt;/span&gt;&lt;span class=&quot;token&quot;&gt;&amp;lt;&lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #22863a;&quot;&gt;form&lt;/span&gt;&lt;span class=&quot;token&quot;&gt; &lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #6f42c1;&quot;&gt;method&lt;/span&gt;&lt;span class=&quot;token&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #032f62;&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #032f62;&quot;&gt;POST&lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #032f62;&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span class=&quot;token&quot;&gt; &lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #6f42c1;&quot;&gt;action&lt;/span&gt;&lt;span class=&quot;token&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #032f62;&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #005cc5;&quot;&gt;{{&lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #032f62;&quot;&gt; &lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #6f42c1;&quot;&gt;route&lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #032f62;&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #032f62;&quot;&gt;&amp;#039;&lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #032f62;&quot;&gt;verification.send&lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #032f62;&quot;&gt;&amp;#039;&lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #032f62;&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #032f62;&quot;&gt; &lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #005cc5;&quot;&gt;}}&lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #032f62;&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span class=&quot;token&quot;&gt;&amp;gt;&lt;/span&gt;&lt;span class=&quot;token&quot;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;token&quot;&gt;                &lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #d73a49;&quot;&gt;@csrf&lt;/span&gt;&lt;span class=&quot;token&quot;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;token&quot;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;token&quot;&gt;                &lt;/span&gt;&lt;span class=&quot;token&quot;&gt;&amp;lt;&lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #22863a;&quot;&gt;div&lt;/span&gt;&lt;span class=&quot;token&quot;&gt;&amp;gt;&lt;/span&gt;&lt;span class=&quot;token&quot;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;token&quot;&gt;                    &lt;/span&gt;&lt;span class=&quot;token&quot;&gt;&amp;lt;&lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #22863a;&quot;&gt;x-button&lt;/span&gt;&lt;span class=&quot;token&quot;&gt; &lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #6f42c1;&quot;&gt;type&lt;/span&gt;&lt;span class=&quot;token&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #032f62;&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #032f62;&quot;&gt;submit&lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #032f62;&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span class=&quot;token&quot;&gt;&amp;gt;&lt;/span&gt;&lt;span class=&quot;token&quot;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;token&quot;&gt;                        &lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #005cc5;&quot;&gt;{{&lt;/span&gt;&lt;span class=&quot;token&quot;&gt; &lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #6f42c1;&quot;&gt;__&lt;/span&gt;&lt;span class=&quot;token&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #032f62;&quot;&gt;&amp;#039;&lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #032f62;&quot;&gt;Resend Verification Email&lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #032f62;&quot;&gt;&amp;#039;&lt;/span&gt;&lt;span class=&quot;token&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token&quot;&gt; &lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #005cc5;&quot;&gt;}}&lt;/span&gt;&lt;span class=&quot;token&quot;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;token&quot;&gt;                    &lt;/span&gt;&lt;span class=&quot;token&quot;&gt;&amp;lt;/&lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #22863a;&quot;&gt;x-button&lt;/span&gt;&lt;span class=&quot;token&quot;&gt;&amp;gt;&lt;/span&gt;&lt;span class=&quot;token&quot;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;token&quot;&gt;                &lt;/span&gt;&lt;span class=&quot;token&quot;&gt;&amp;lt;/&lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #22863a;&quot;&gt;div&lt;/span&gt;&lt;span class=&quot;token&quot;&gt;&amp;gt;&lt;/span&gt;&lt;span class=&quot;token&quot;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;token&quot;&gt;            &lt;/span&gt;&lt;span class=&quot;token&quot;&gt;&amp;lt;/&lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #22863a;&quot;&gt;form&lt;/span&gt;&lt;span class=&quot;token&quot;&gt;&amp;gt;&lt;/span&gt;&lt;span class=&quot;token&quot;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;token&quot;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;token&quot;&gt;            &lt;/span&gt;&lt;span class=&quot;token&quot;&gt;&amp;lt;&lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #22863a;&quot;&gt;div&lt;/span&gt;&lt;span class=&quot;token&quot;&gt;&amp;gt;&lt;/span&gt;&lt;span class=&quot;token&quot;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;token&quot;&gt;                &lt;/span&gt;&lt;span class=&quot;token&quot;&gt;&amp;lt;&lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #22863a;&quot;&gt;a&lt;/span&gt;&lt;span class=&quot;token&quot;&gt; &lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #6f42c1;&quot;&gt;href&lt;/span&gt;&lt;span class=&quot;token&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #032f62;&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #005cc5;&quot;&gt;{{&lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #032f62;&quot;&gt; &lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #6f42c1;&quot;&gt;route&lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #032f62;&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #032f62;&quot;&gt;&amp;#039;&lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #032f62;&quot;&gt;profile.show&lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #032f62;&quot;&gt;&amp;#039;&lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #032f62;&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #032f62;&quot;&gt; &lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #005cc5;&quot;&gt;}}&lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #032f62;&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span class=&quot;token&quot;&gt; &lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #6f42c1;&quot;&gt;class&lt;/span&gt;&lt;span class=&quot;token&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #032f62;&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #032f62;&quot;&gt;underline text-sm text-gray-600 hover:text-gray-900 rounded-md focus:outline-none focus:ring-2 focus:ring-offset-2 focus:ring-primary-500&lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #032f62;&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span class=&quot;token&quot;&gt;&amp;gt;&lt;/span&gt;&lt;span class=&quot;token&quot;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;token&quot;&gt;                    &lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #005cc5;&quot;&gt;{{&lt;/span&gt;&lt;span class=&quot;token&quot;&gt; &lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #6f42c1;&quot;&gt;__&lt;/span&gt;&lt;span class=&quot;token&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #032f62;&quot;&gt;&amp;#039;&lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #032f62;&quot;&gt;Edit Profile&lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #032f62;&quot;&gt;&amp;#039;&lt;/span&gt;&lt;span class=&quot;token&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token&quot;&gt; &lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #005cc5;&quot;&gt;}}&lt;/span&gt;&lt;span class=&quot;token&quot;&gt;&amp;lt;/&lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #22863a;&quot;&gt;a&lt;/span&gt;&lt;span class=&quot;token&quot;&gt;&amp;gt;&lt;/span&gt;&lt;span class=&quot;token&quot;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;token&quot;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;token&quot;&gt;                &lt;/span&gt;&lt;span class=&quot;token&quot;&gt;&amp;lt;&lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #22863a;&quot;&gt;form&lt;/span&gt;&lt;span class=&quot;token&quot;&gt; &lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #6f42c1;&quot;&gt;method&lt;/span&gt;&lt;span class=&quot;token&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #032f62;&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #032f62;&quot;&gt;POST&lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #032f62;&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span class=&quot;token&quot;&gt; &lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #6f42c1;&quot;&gt;action&lt;/span&gt;&lt;span class=&quot;token&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #032f62;&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #005cc5;&quot;&gt;{{&lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #032f62;&quot;&gt; &lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #6f42c1;&quot;&gt;route&lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #032f62;&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #032f62;&quot;&gt;&amp;#039;&lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #032f62;&quot;&gt;logout&lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #032f62;&quot;&gt;&amp;#039;&lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #032f62;&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #032f62;&quot;&gt; &lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #005cc5;&quot;&gt;}}&lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #032f62;&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span class=&quot;token&quot;&gt; &lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #6f42c1;&quot;&gt;class&lt;/span&gt;&lt;span class=&quot;token&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #032f62;&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #032f62;&quot;&gt;inline&lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #032f62;&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span class=&quot;token&quot;&gt;&amp;gt;&lt;/span&gt;&lt;span class=&quot;token&quot;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;token&quot;&gt;                    &lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #d73a49;&quot;&gt;@csrf&lt;/span&gt;&lt;span class=&quot;token&quot;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;token&quot;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;token&quot;&gt;                    &lt;/span&gt;&lt;span class=&quot;token&quot;&gt;&amp;lt;&lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #22863a;&quot;&gt;button&lt;/span&gt;&lt;span class=&quot;token&quot;&gt; &lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #6f42c1;&quot;&gt;type&lt;/span&gt;&lt;span class=&quot;token&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #032f62;&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #032f62;&quot;&gt;submit&lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #032f62;&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span class=&quot;token&quot;&gt; &lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #6f42c1;&quot;&gt;class&lt;/span&gt;&lt;span class=&quot;token&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #032f62;&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #032f62;&quot;&gt;underline text-sm text-gray-600 hover:text-gray-900 rounded-md focus:outline-none focus:ring-2 focus:ring-offset-2 focus:ring-primary-500 ms-2&lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #032f62;&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span class=&quot;token&quot;&gt;&amp;gt;&lt;/span&gt;&lt;span class=&quot;token&quot;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;token&quot;&gt;                        &lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #005cc5;&quot;&gt;{{&lt;/span&gt;&lt;span class=&quot;token&quot;&gt; &lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #6f42c1;&quot;&gt;__&lt;/span&gt;&lt;span class=&quot;token&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #032f62;&quot;&gt;&amp;#039;&lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #032f62;&quot;&gt;Log Out&lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #032f62;&quot;&gt;&amp;#039;&lt;/span&gt;&lt;span class=&quot;token&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token&quot;&gt; &lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #005cc5;&quot;&gt;}}&lt;/span&gt;&lt;span class=&quot;token&quot;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;token&quot;&gt;                    &lt;/span&gt;&lt;span class=&quot;token&quot;&gt;&amp;lt;/&lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #22863a;&quot;&gt;button&lt;/span&gt;&lt;span class=&quot;token&quot;&gt;&amp;gt;&lt;/span&gt;&lt;span class=&quot;token&quot;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;token&quot;&gt;                &lt;/span&gt;&lt;span class=&quot;token&quot;&gt;&amp;lt;/&lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #22863a;&quot;&gt;form&lt;/span&gt;&lt;span class=&quot;token&quot;&gt;&amp;gt;&lt;/span&gt;&lt;span class=&quot;token&quot;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;token&quot;&gt;            &lt;/span&gt;&lt;span class=&quot;token&quot;&gt;&amp;lt;/&lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #22863a;&quot;&gt;div&lt;/span&gt;&lt;span class=&quot;token&quot;&gt;&amp;gt;&lt;/span&gt;&lt;span class=&quot;token&quot;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;token&quot;&gt;        &lt;/span&gt;&lt;span class=&quot;token&quot;&gt;&amp;lt;/&lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #22863a;&quot;&gt;div&lt;/span&gt;&lt;span class=&quot;token&quot;&gt;&amp;gt;&lt;/span&gt;&lt;span class=&quot;token&quot;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;token&quot;&gt;    &lt;/span&gt;&lt;span class=&quot;token&quot;&gt;&amp;lt;/&lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #22863a;&quot;&gt;x-authentication-card&lt;/span&gt;&lt;span class=&quot;token&quot;&gt;&amp;gt;&lt;/span&gt;&lt;span class=&quot;token&quot;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;token&quot;&gt;&amp;lt;/&lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #22863a;&quot;&gt;x-guest-layout&lt;/span&gt;&lt;span class=&quot;token&quot;&gt;&amp;gt;&lt;/span&gt;&lt;span class=&quot;token&quot;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;I added a fixed height because I don't like the content to shift after initial render.&lt;/p&gt;
&lt;p&gt;It's easy, it's automatic!&lt;/p&gt;
&lt;p&gt;If you wanna learn more about the confirmation rate with Sniper Link, &lt;a href=&quot;https://growth.design/sniper-link&quot;&gt;this blogpost&lt;/a&gt; goes deep into the subject.&lt;/p&gt;</summary>
        <content type="html">&lt;p&gt;Hey! I discovered this tool while using &lt;a href=&quot;https://mailcoach.app&quot;&gt;Mailcoach&lt;/a&gt; and I think it's very useful. May I introduce &lt;a href=&quot;https://sniperl.ink&quot;&gt;Sniper link&lt;/a&gt;, a little javascript tool showing a button that directly opens the user’s email client.&lt;/p&gt;
&lt;!--more--&gt;
&lt;div style=&quot;text-align:center;&quot;&gt;
&lt;img style=&quot;display:inline-block;&quot; alt=&quot;example&quot; src=&quot;https://assets.srwiez.com/sniperlink/8e036701-3d09-47c9-99f5-30ffda15ea28.png&quot;/&gt;
&lt;/div
&lt;p&gt;Here is an example of implementing it in Laravel Fortify, find &lt;strong&gt;verify-email.blade.php&lt;/strong&gt;, and add the following code&lt;/p&gt;
&lt;div x-data=&quot;codeBlock&quot; class=&quot;code-block relative&quot;&gt;&lt;div class=&quot;flex space-x-2 items-center absolute top-0 right-0&quot;&gt;
    &lt;div x-cloak x-show=&quot;showMessage&quot; x-transition class=&quot;py-2 animate-bounce transition duration-300 mt-1 text-sky-500 text-xs&quot;&gt;Copied!&lt;/div&gt;
    &lt;button
        type=&quot;button&quot;
        title=&quot;Copy to clipboard&quot;
        class=&quot;hidden sm:block p-2 pl-3 transition duration-300&quot;
        @click.prevent=&quot;copyToClipboard&quot;
        :class=&quot;{
            'text-black/30 hover:text-black/80': !showMessage,
            'text-sky-500 hover:text-sky-700': showMessage,
        }&quot;&gt;
        &lt;svg xmlns=&quot;http://www.w3.org/2000/svg&quot; fill=&quot;none&quot; viewBox=&quot;0 0 24 24&quot; stroke-width=&quot;1.5&quot; stroke=&quot;currentColor&quot; class=&quot;block w-6 h-6&quot;&gt;
            &lt;path fill=&quot;white&quot; stroke-linecap=&quot;round&quot; stroke-linejoin=&quot;round&quot; d=&quot;M11.35 3.836c-.065.21-.1.433-.1.664 0 .414.336.75.75.75h4.5a.75.75 0 00.75-.75 2.25 2.25 0 00-.1-.664m-5.8 0A2.251 2.251 0 0113.5 2.25H15c1.012 0 1.867.668 2.15 1.586m-5.8 0c-.376.023-.75.05-1.124.08C9.095 4.01 8.25 4.973 8.25 6.108V8.25m8.9-4.414c.376.023.75.05 1.124.08 1.131.094 1.976 1.057 1.976 2.192V16.5A2.25 2.25 0 0118 18.75h-2.25m-7.5-10.5H4.875c-.621 0-1.125.504-1.125 1.125v11.25c0 .621.504 1.125 1.125 1.125h9.75c.621 0 1.125-.504 1.125-1.125V18.75m-7.5-10.5h6.375c.621 0 1.125.504 1.125 1.125v9.375m-8.25-3l1.5 1.5 3-3.75&quot; /&gt;
        &lt;/svg&gt;
    &lt;/button&gt;
&lt;/div&gt;&lt;pre class=&quot;phiki language-blade github-light&quot; data-language=&quot;blade&quot; style=&quot;background-color: #fff;color: #24292e;--phiki-line-highlight: #f6f8fa;&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;token&quot;&gt;&amp;lt;&lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #22863a;&quot;&gt;x-guest-layout&lt;/span&gt;&lt;span class=&quot;token&quot;&gt;&amp;gt;&lt;/span&gt;&lt;span class=&quot;token&quot;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;token&quot;&gt;    &lt;/span&gt;&lt;span class=&quot;token&quot;&gt;&amp;lt;&lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #22863a;&quot;&gt;x-authentication-card&lt;/span&gt;&lt;span class=&quot;token&quot;&gt;&amp;gt;&lt;/span&gt;&lt;span class=&quot;token&quot;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;token&quot;&gt;        &lt;/span&gt;&lt;span class=&quot;token&quot;&gt;&amp;lt;&lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #22863a;&quot;&gt;x-slot&lt;/span&gt;&lt;span class=&quot;token&quot;&gt; &lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #6f42c1;&quot;&gt;name&lt;/span&gt;&lt;span class=&quot;token&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #032f62;&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #032f62;&quot;&gt;logo&lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #032f62;&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span class=&quot;token&quot;&gt;&amp;gt;&lt;/span&gt;&lt;span class=&quot;token&quot;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;token&quot;&gt;            &lt;/span&gt;&lt;span class=&quot;token&quot;&gt;&amp;lt;&lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #22863a;&quot;&gt;x-authentication-card-logo&lt;/span&gt;&lt;span class=&quot;token&quot;&gt;/&amp;gt;&lt;/span&gt;&lt;span class=&quot;token&quot;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;token&quot;&gt;        &lt;/span&gt;&lt;span class=&quot;token&quot;&gt;&amp;lt;/&lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #22863a;&quot;&gt;x-slot&lt;/span&gt;&lt;span class=&quot;token&quot;&gt;&amp;gt;&lt;/span&gt;&lt;span class=&quot;token&quot;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;token&quot;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;token&quot;&gt;        &lt;/span&gt;&lt;span class=&quot;token&quot;&gt;&amp;lt;&lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #22863a;&quot;&gt;div&lt;/span&gt;&lt;span class=&quot;token&quot;&gt; &lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #6f42c1;&quot;&gt;class&lt;/span&gt;&lt;span class=&quot;token&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #032f62;&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #032f62;&quot;&gt;mb-4 text-sm text-gray-600&lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #032f62;&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span class=&quot;token&quot;&gt;&amp;gt;&lt;/span&gt;&lt;span class=&quot;token&quot;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;token&quot;&gt;            &lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #005cc5;&quot;&gt;{{&lt;/span&gt;&lt;span class=&quot;token&quot;&gt; &lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #6f42c1;&quot;&gt;__&lt;/span&gt;&lt;span class=&quot;token&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #032f62;&quot;&gt;&amp;#039;&lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #032f62;&quot;&gt;Before continuing, could you verify your email address by clicking on the link we just emailed to you? If you didn&lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #005cc5;&quot;&gt;\&amp;#039;&lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #032f62;&quot;&gt;t receive the email, we will gladly send you another.&lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #032f62;&quot;&gt;&amp;#039;&lt;/span&gt;&lt;span class=&quot;token&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token&quot;&gt; &lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #005cc5;&quot;&gt;}}&lt;/span&gt;&lt;span class=&quot;token&quot;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;token&quot;&gt;        &lt;/span&gt;&lt;span class=&quot;token&quot;&gt;&amp;lt;/&lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #22863a;&quot;&gt;div&lt;/span&gt;&lt;span class=&quot;token&quot;&gt;&amp;gt;&lt;/span&gt;&lt;span class=&quot;token&quot;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;token&quot;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;token&quot;&gt;        &lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #d73a49;&quot;&gt;@if &lt;/span&gt;&lt;span class=&quot;token&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #6f42c1;&quot;&gt;session&lt;/span&gt;&lt;span class=&quot;token&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #032f62;&quot;&gt;&amp;#039;&lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #032f62;&quot;&gt;status&lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #032f62;&quot;&gt;&amp;#039;&lt;/span&gt;&lt;span class=&quot;token&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token&quot;&gt; &lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #d73a49;&quot;&gt;==&lt;/span&gt;&lt;span class=&quot;token&quot;&gt; &lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #032f62;&quot;&gt;&amp;#039;&lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #032f62;&quot;&gt;verification-link-sent&lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #032f62;&quot;&gt;&amp;#039;&lt;/span&gt;&lt;span class=&quot;token&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token&quot;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;token&quot;&gt;            &lt;/span&gt;&lt;span class=&quot;token&quot;&gt;&amp;lt;&lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #22863a;&quot;&gt;div&lt;/span&gt;&lt;span class=&quot;token&quot;&gt; &lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #6f42c1;&quot;&gt;class&lt;/span&gt;&lt;span class=&quot;token&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #032f62;&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #032f62;&quot;&gt;mb-4 font-medium text-sm text-green-600&lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #032f62;&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span class=&quot;token&quot;&gt;&amp;gt;&lt;/span&gt;&lt;span class=&quot;token&quot;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;token&quot;&gt;                &lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #005cc5;&quot;&gt;{{&lt;/span&gt;&lt;span class=&quot;token&quot;&gt; &lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #6f42c1;&quot;&gt;__&lt;/span&gt;&lt;span class=&quot;token&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #032f62;&quot;&gt;&amp;#039;&lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #032f62;&quot;&gt;A new verification link has been sent to the email address you provided in your profile settings.&lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #032f62;&quot;&gt;&amp;#039;&lt;/span&gt;&lt;span class=&quot;token&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token&quot;&gt; &lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #005cc5;&quot;&gt;}}&lt;/span&gt;&lt;span class=&quot;token&quot;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;token&quot;&gt;            &lt;/span&gt;&lt;span class=&quot;token&quot;&gt;&amp;lt;/&lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #22863a;&quot;&gt;div&lt;/span&gt;&lt;span class=&quot;token&quot;&gt;&amp;gt;&lt;/span&gt;&lt;span class=&quot;token&quot;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;token&quot;&gt;        &lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #d73a49;&quot;&gt;@endif&lt;/span&gt;&lt;span class=&quot;token&quot;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;line highlight&quot;&gt;&lt;span class=&quot;token&quot;&gt;        &lt;/span&gt;&lt;span class=&quot;token&quot;&gt;&amp;lt;&lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #22863a;&quot;&gt;div&lt;/span&gt;&lt;span class=&quot;token&quot;&gt; &lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #6f42c1;&quot;&gt;class&lt;/span&gt;&lt;span class=&quot;token&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #032f62;&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #032f62;&quot;&gt;flex items-center justify-around min-h-14&lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #032f62;&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span class=&quot;token&quot;&gt;&amp;gt;&lt;/span&gt;&lt;span class=&quot;token&quot;&gt; 
&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;line highlight&quot;&gt;&lt;span class=&quot;token&quot;&gt;            &lt;/span&gt;&lt;span class=&quot;token&quot;&gt;&amp;lt;&lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #22863a;&quot;&gt;sniper-link&lt;/span&gt;&lt;span class=&quot;token&quot;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;line highlight&quot;&gt;&lt;span class=&quot;token&quot;&gt;                &lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #6f42c1;&quot;&gt;recipient&lt;/span&gt;&lt;span class=&quot;token&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #032f62;&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #005cc5;&quot;&gt;{{&lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #032f62;&quot;&gt; &lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #6f42c1;&quot;&gt;auth&lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #032f62;&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #032f62;&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #d73a49;&quot;&gt;-&amp;gt;&lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #6f42c1;&quot;&gt;user&lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #032f62;&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #032f62;&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #d73a49;&quot;&gt;-&amp;gt;&lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #24292e;&quot;&gt;email&lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #032f62;&quot;&gt; &lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #005cc5;&quot;&gt;}}&lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #032f62;&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span class=&quot;token&quot;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;line highlight&quot;&gt;&lt;span class=&quot;token&quot;&gt;                &lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #6f42c1;&quot;&gt;sender&lt;/span&gt;&lt;span class=&quot;token&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #032f62;&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #005cc5;&quot;&gt;{{&lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #032f62;&quot;&gt; &lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #6f42c1;&quot;&gt;config&lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #032f62;&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #032f62;&quot;&gt;&amp;#039;&lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #032f62;&quot;&gt;mail.from.address&lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #032f62;&quot;&gt;&amp;#039;&lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #032f62;&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #032f62;&quot;&gt; &lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #005cc5;&quot;&gt;}}&lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #032f62;&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span class=&quot;token&quot;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;line highlight&quot;&gt;&lt;span class=&quot;token&quot;&gt;                &lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #6f42c1;&quot;&gt;template&lt;/span&gt;&lt;span class=&quot;token&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #032f62;&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #032f62;&quot;&gt;Check my emails on {provider}&lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #032f62;&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span class=&quot;token&quot;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;line highlight&quot;&gt;&lt;span class=&quot;token&quot;&gt;            &lt;/span&gt;&lt;span class=&quot;token&quot;&gt;/&amp;gt;&lt;/span&gt;&lt;span class=&quot;token&quot;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;line highlight&quot;&gt;&lt;span class=&quot;token&quot;&gt;            &lt;/span&gt;&lt;span class=&quot;token&quot;&gt;&amp;lt;&lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #22863a;&quot;&gt;script&lt;/span&gt;&lt;span class=&quot;token&quot;&gt; &lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #6f42c1;&quot;&gt;src&lt;/span&gt;&lt;span class=&quot;token&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #032f62;&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #032f62;&quot;&gt;https://sniperl.ink/v1/sniper-link.js&lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #032f62;&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span class=&quot;token&quot;&gt; &lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #6f42c1;&quot;&gt;defer&lt;/span&gt;&lt;span class=&quot;token&quot;&gt;&amp;gt;&lt;/span&gt;&lt;span class=&quot;token&quot;&gt;&amp;lt;&lt;/span&gt;&lt;span class=&quot;token&quot;&gt;/&lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #22863a;&quot;&gt;script&lt;/span&gt;&lt;span class=&quot;token&quot;&gt;&amp;gt;&lt;/span&gt;&lt;span class=&quot;token&quot;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;line highlight&quot;&gt;&lt;span class=&quot;token&quot;&gt;        &lt;/span&gt;&lt;span class=&quot;token&quot;&gt;&amp;lt;/&lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #22863a;&quot;&gt;div&lt;/span&gt;&lt;span class=&quot;token&quot;&gt;&amp;gt;&lt;/span&gt;&lt;span class=&quot;token&quot;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;token&quot;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;token&quot;&gt;        &lt;/span&gt;&lt;span class=&quot;token&quot;&gt;&amp;lt;&lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #22863a;&quot;&gt;div&lt;/span&gt;&lt;span class=&quot;token&quot;&gt; &lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #6f42c1;&quot;&gt;class&lt;/span&gt;&lt;span class=&quot;token&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #032f62;&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #032f62;&quot;&gt;mt-4 flex items-center justify-between&lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #032f62;&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span class=&quot;token&quot;&gt;&amp;gt;&lt;/span&gt;&lt;span class=&quot;token&quot;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;token&quot;&gt;            &lt;/span&gt;&lt;span class=&quot;token&quot;&gt;&amp;lt;&lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #22863a;&quot;&gt;form&lt;/span&gt;&lt;span class=&quot;token&quot;&gt; &lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #6f42c1;&quot;&gt;method&lt;/span&gt;&lt;span class=&quot;token&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #032f62;&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #032f62;&quot;&gt;POST&lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #032f62;&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span class=&quot;token&quot;&gt; &lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #6f42c1;&quot;&gt;action&lt;/span&gt;&lt;span class=&quot;token&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #032f62;&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #005cc5;&quot;&gt;{{&lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #032f62;&quot;&gt; &lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #6f42c1;&quot;&gt;route&lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #032f62;&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #032f62;&quot;&gt;&amp;#039;&lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #032f62;&quot;&gt;verification.send&lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #032f62;&quot;&gt;&amp;#039;&lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #032f62;&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #032f62;&quot;&gt; &lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #005cc5;&quot;&gt;}}&lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #032f62;&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span class=&quot;token&quot;&gt;&amp;gt;&lt;/span&gt;&lt;span class=&quot;token&quot;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;token&quot;&gt;                &lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #d73a49;&quot;&gt;@csrf&lt;/span&gt;&lt;span class=&quot;token&quot;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;token&quot;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;token&quot;&gt;                &lt;/span&gt;&lt;span class=&quot;token&quot;&gt;&amp;lt;&lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #22863a;&quot;&gt;div&lt;/span&gt;&lt;span class=&quot;token&quot;&gt;&amp;gt;&lt;/span&gt;&lt;span class=&quot;token&quot;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;token&quot;&gt;                    &lt;/span&gt;&lt;span class=&quot;token&quot;&gt;&amp;lt;&lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #22863a;&quot;&gt;x-button&lt;/span&gt;&lt;span class=&quot;token&quot;&gt; &lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #6f42c1;&quot;&gt;type&lt;/span&gt;&lt;span class=&quot;token&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #032f62;&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #032f62;&quot;&gt;submit&lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #032f62;&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span class=&quot;token&quot;&gt;&amp;gt;&lt;/span&gt;&lt;span class=&quot;token&quot;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;token&quot;&gt;                        &lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #005cc5;&quot;&gt;{{&lt;/span&gt;&lt;span class=&quot;token&quot;&gt; &lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #6f42c1;&quot;&gt;__&lt;/span&gt;&lt;span class=&quot;token&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #032f62;&quot;&gt;&amp;#039;&lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #032f62;&quot;&gt;Resend Verification Email&lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #032f62;&quot;&gt;&amp;#039;&lt;/span&gt;&lt;span class=&quot;token&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token&quot;&gt; &lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #005cc5;&quot;&gt;}}&lt;/span&gt;&lt;span class=&quot;token&quot;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;token&quot;&gt;                    &lt;/span&gt;&lt;span class=&quot;token&quot;&gt;&amp;lt;/&lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #22863a;&quot;&gt;x-button&lt;/span&gt;&lt;span class=&quot;token&quot;&gt;&amp;gt;&lt;/span&gt;&lt;span class=&quot;token&quot;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;token&quot;&gt;                &lt;/span&gt;&lt;span class=&quot;token&quot;&gt;&amp;lt;/&lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #22863a;&quot;&gt;div&lt;/span&gt;&lt;span class=&quot;token&quot;&gt;&amp;gt;&lt;/span&gt;&lt;span class=&quot;token&quot;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;token&quot;&gt;            &lt;/span&gt;&lt;span class=&quot;token&quot;&gt;&amp;lt;/&lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #22863a;&quot;&gt;form&lt;/span&gt;&lt;span class=&quot;token&quot;&gt;&amp;gt;&lt;/span&gt;&lt;span class=&quot;token&quot;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;token&quot;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;token&quot;&gt;            &lt;/span&gt;&lt;span class=&quot;token&quot;&gt;&amp;lt;&lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #22863a;&quot;&gt;div&lt;/span&gt;&lt;span class=&quot;token&quot;&gt;&amp;gt;&lt;/span&gt;&lt;span class=&quot;token&quot;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;token&quot;&gt;                &lt;/span&gt;&lt;span class=&quot;token&quot;&gt;&amp;lt;&lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #22863a;&quot;&gt;a&lt;/span&gt;&lt;span class=&quot;token&quot;&gt; &lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #6f42c1;&quot;&gt;href&lt;/span&gt;&lt;span class=&quot;token&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #032f62;&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #005cc5;&quot;&gt;{{&lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #032f62;&quot;&gt; &lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #6f42c1;&quot;&gt;route&lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #032f62;&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #032f62;&quot;&gt;&amp;#039;&lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #032f62;&quot;&gt;profile.show&lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #032f62;&quot;&gt;&amp;#039;&lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #032f62;&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #032f62;&quot;&gt; &lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #005cc5;&quot;&gt;}}&lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #032f62;&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span class=&quot;token&quot;&gt; &lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #6f42c1;&quot;&gt;class&lt;/span&gt;&lt;span class=&quot;token&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #032f62;&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #032f62;&quot;&gt;underline text-sm text-gray-600 hover:text-gray-900 rounded-md focus:outline-none focus:ring-2 focus:ring-offset-2 focus:ring-primary-500&lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #032f62;&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span class=&quot;token&quot;&gt;&amp;gt;&lt;/span&gt;&lt;span class=&quot;token&quot;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;token&quot;&gt;                    &lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #005cc5;&quot;&gt;{{&lt;/span&gt;&lt;span class=&quot;token&quot;&gt; &lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #6f42c1;&quot;&gt;__&lt;/span&gt;&lt;span class=&quot;token&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #032f62;&quot;&gt;&amp;#039;&lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #032f62;&quot;&gt;Edit Profile&lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #032f62;&quot;&gt;&amp;#039;&lt;/span&gt;&lt;span class=&quot;token&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token&quot;&gt; &lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #005cc5;&quot;&gt;}}&lt;/span&gt;&lt;span class=&quot;token&quot;&gt;&amp;lt;/&lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #22863a;&quot;&gt;a&lt;/span&gt;&lt;span class=&quot;token&quot;&gt;&amp;gt;&lt;/span&gt;&lt;span class=&quot;token&quot;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;token&quot;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;token&quot;&gt;                &lt;/span&gt;&lt;span class=&quot;token&quot;&gt;&amp;lt;&lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #22863a;&quot;&gt;form&lt;/span&gt;&lt;span class=&quot;token&quot;&gt; &lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #6f42c1;&quot;&gt;method&lt;/span&gt;&lt;span class=&quot;token&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #032f62;&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #032f62;&quot;&gt;POST&lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #032f62;&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span class=&quot;token&quot;&gt; &lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #6f42c1;&quot;&gt;action&lt;/span&gt;&lt;span class=&quot;token&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #032f62;&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #005cc5;&quot;&gt;{{&lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #032f62;&quot;&gt; &lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #6f42c1;&quot;&gt;route&lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #032f62;&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #032f62;&quot;&gt;&amp;#039;&lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #032f62;&quot;&gt;logout&lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #032f62;&quot;&gt;&amp;#039;&lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #032f62;&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #032f62;&quot;&gt; &lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #005cc5;&quot;&gt;}}&lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #032f62;&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span class=&quot;token&quot;&gt; &lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #6f42c1;&quot;&gt;class&lt;/span&gt;&lt;span class=&quot;token&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #032f62;&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #032f62;&quot;&gt;inline&lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #032f62;&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span class=&quot;token&quot;&gt;&amp;gt;&lt;/span&gt;&lt;span class=&quot;token&quot;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;token&quot;&gt;                    &lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #d73a49;&quot;&gt;@csrf&lt;/span&gt;&lt;span class=&quot;token&quot;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;token&quot;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;token&quot;&gt;                    &lt;/span&gt;&lt;span class=&quot;token&quot;&gt;&amp;lt;&lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #22863a;&quot;&gt;button&lt;/span&gt;&lt;span class=&quot;token&quot;&gt; &lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #6f42c1;&quot;&gt;type&lt;/span&gt;&lt;span class=&quot;token&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #032f62;&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #032f62;&quot;&gt;submit&lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #032f62;&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span class=&quot;token&quot;&gt; &lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #6f42c1;&quot;&gt;class&lt;/span&gt;&lt;span class=&quot;token&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #032f62;&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #032f62;&quot;&gt;underline text-sm text-gray-600 hover:text-gray-900 rounded-md focus:outline-none focus:ring-2 focus:ring-offset-2 focus:ring-primary-500 ms-2&lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #032f62;&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span class=&quot;token&quot;&gt;&amp;gt;&lt;/span&gt;&lt;span class=&quot;token&quot;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;token&quot;&gt;                        &lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #005cc5;&quot;&gt;{{&lt;/span&gt;&lt;span class=&quot;token&quot;&gt; &lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #6f42c1;&quot;&gt;__&lt;/span&gt;&lt;span class=&quot;token&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #032f62;&quot;&gt;&amp;#039;&lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #032f62;&quot;&gt;Log Out&lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #032f62;&quot;&gt;&amp;#039;&lt;/span&gt;&lt;span class=&quot;token&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token&quot;&gt; &lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #005cc5;&quot;&gt;}}&lt;/span&gt;&lt;span class=&quot;token&quot;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;token&quot;&gt;                    &lt;/span&gt;&lt;span class=&quot;token&quot;&gt;&amp;lt;/&lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #22863a;&quot;&gt;button&lt;/span&gt;&lt;span class=&quot;token&quot;&gt;&amp;gt;&lt;/span&gt;&lt;span class=&quot;token&quot;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;token&quot;&gt;                &lt;/span&gt;&lt;span class=&quot;token&quot;&gt;&amp;lt;/&lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #22863a;&quot;&gt;form&lt;/span&gt;&lt;span class=&quot;token&quot;&gt;&amp;gt;&lt;/span&gt;&lt;span class=&quot;token&quot;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;token&quot;&gt;            &lt;/span&gt;&lt;span class=&quot;token&quot;&gt;&amp;lt;/&lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #22863a;&quot;&gt;div&lt;/span&gt;&lt;span class=&quot;token&quot;&gt;&amp;gt;&lt;/span&gt;&lt;span class=&quot;token&quot;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;token&quot;&gt;        &lt;/span&gt;&lt;span class=&quot;token&quot;&gt;&amp;lt;/&lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #22863a;&quot;&gt;div&lt;/span&gt;&lt;span class=&quot;token&quot;&gt;&amp;gt;&lt;/span&gt;&lt;span class=&quot;token&quot;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;token&quot;&gt;    &lt;/span&gt;&lt;span class=&quot;token&quot;&gt;&amp;lt;/&lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #22863a;&quot;&gt;x-authentication-card&lt;/span&gt;&lt;span class=&quot;token&quot;&gt;&amp;gt;&lt;/span&gt;&lt;span class=&quot;token&quot;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;token&quot;&gt;&amp;lt;/&lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #22863a;&quot;&gt;x-guest-layout&lt;/span&gt;&lt;span class=&quot;token&quot;&gt;&amp;gt;&lt;/span&gt;&lt;span class=&quot;token&quot;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;I added a fixed height because I don't like the content to shift after initial render.&lt;/p&gt;
&lt;p&gt;It's easy, it's automatic!&lt;/p&gt;
&lt;p&gt;If you wanna learn more about the confirmation rate with Sniper Link, &lt;a href=&quot;https://growth.design/sniper-link&quot;&gt;this blogpost&lt;/a&gt; goes deep into the subject.&lt;/p&gt;</content>
        <author>
            <name>Eser DENIZ</name>
        </author>
    </entry>
    <entry>
        <title type="text">Improved handling of 404 errors with Livewire</title>
        <link href="https://srwiez.com/posts/improved-handling-of-404-errors-with-livewire"/>
        <id>https://srwiez.com/posts/improved-handling-of-404-errors-with-livewire</id>
        <published>2024-02-11T00:00:00+00:00</published>
        <updated>2024-02-11T12:23:50+00:00</updated>
        <summary type="text">&lt;p&gt;I like to use the findOrFail() function in Livewire methods that call actions. But I really don't like the default behaviour of Livewire showing a modal view with a 404. Let me show you how to personalise that.&lt;/p&gt;
&lt;!--more--&gt;
&lt;p&gt;This is a short solution, simply copy this code into your &lt;code&gt;app.js&lt;/code&gt; (or in a &lt;code&gt;&amp;lt;script&amp;gt;&lt;/code&gt; tag if you want different behaviour through your app) and customize it with a modal or notification for your user. What makes the most sense for your application.&lt;/p&gt;
&lt;p&gt;Since I'm using it in a CRUD context here, here is a simple and effective code.&lt;/p&gt;
&lt;div x-data=&quot;codeBlock&quot; class=&quot;code-block relative&quot;&gt;&lt;div class=&quot;flex space-x-2 items-center absolute top-0 right-0&quot;&gt;
    &lt;div x-cloak x-show=&quot;showMessage&quot; x-transition class=&quot;py-2 animate-bounce transition duration-300 mt-1 text-sky-500 text-xs&quot;&gt;Copied!&lt;/div&gt;
    &lt;button
        type=&quot;button&quot;
        title=&quot;Copy to clipboard&quot;
        class=&quot;hidden sm:block p-2 pl-3 transition duration-300&quot;
        @click.prevent=&quot;copyToClipboard&quot;
        :class=&quot;{
            'text-black/30 hover:text-black/80': !showMessage,
            'text-sky-500 hover:text-sky-700': showMessage,
        }&quot;&gt;
        &lt;svg xmlns=&quot;http://www.w3.org/2000/svg&quot; fill=&quot;none&quot; viewBox=&quot;0 0 24 24&quot; stroke-width=&quot;1.5&quot; stroke=&quot;currentColor&quot; class=&quot;block w-6 h-6&quot;&gt;
            &lt;path fill=&quot;white&quot; stroke-linecap=&quot;round&quot; stroke-linejoin=&quot;round&quot; d=&quot;M11.35 3.836c-.065.21-.1.433-.1.664 0 .414.336.75.75.75h4.5a.75.75 0 00.75-.75 2.25 2.25 0 00-.1-.664m-5.8 0A2.251 2.251 0 0113.5 2.25H15c1.012 0 1.867.668 2.15 1.586m-5.8 0c-.376.023-.75.05-1.124.08C9.095 4.01 8.25 4.973 8.25 6.108V8.25m8.9-4.414c.376.023.75.05 1.124.08 1.131.094 1.976 1.057 1.976 2.192V16.5A2.25 2.25 0 0118 18.75h-2.25m-7.5-10.5H4.875c-.621 0-1.125.504-1.125 1.125v11.25c0 .621.504 1.125 1.125 1.125h9.75c.621 0 1.125-.504 1.125-1.125V18.75m-7.5-10.5h6.375c.621 0 1.125.504 1.125 1.125v9.375m-8.25-3l1.5 1.5 3-3.75&quot; /&gt;
        &lt;/svg&gt;
    &lt;/button&gt;
&lt;/div&gt;&lt;pre class=&quot;phiki language-javascript github-light&quot; data-language=&quot;javascript&quot; style=&quot;background-color: #fff;color: #24292e;&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;token&quot; style=&quot;color: #24292e;&quot;&gt;document&lt;/span&gt;&lt;span class=&quot;token&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #6f42c1;&quot;&gt;addEventListener&lt;/span&gt;&lt;span class=&quot;token&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #032f62;&quot;&gt;&amp;#039;&lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #032f62;&quot;&gt;livewire:init&lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #032f62;&quot;&gt;&amp;#039;&lt;/span&gt;&lt;span class=&quot;token&quot;&gt;,&lt;/span&gt;&lt;span class=&quot;token&quot;&gt; &lt;/span&gt;&lt;span class=&quot;token&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token&quot;&gt; &lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #d73a49;&quot;&gt;=&amp;gt;&lt;/span&gt;&lt;span class=&quot;token&quot;&gt; &lt;/span&gt;&lt;span class=&quot;token&quot;&gt;{&lt;/span&gt;&lt;span class=&quot;token&quot;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;token&quot;&gt;    &lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #24292e;&quot;&gt;Livewire&lt;/span&gt;&lt;span class=&quot;token&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #6f42c1;&quot;&gt;hook&lt;/span&gt;&lt;span class=&quot;token&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #032f62;&quot;&gt;&amp;#039;&lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #032f62;&quot;&gt;request&lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #032f62;&quot;&gt;&amp;#039;&lt;/span&gt;&lt;span class=&quot;token&quot;&gt;,&lt;/span&gt;&lt;span class=&quot;token&quot;&gt; &lt;/span&gt;&lt;span class=&quot;token&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token&quot;&gt;{&lt;/span&gt;&lt;span class=&quot;token&quot;&gt; &lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #e36209;&quot;&gt;fail&lt;/span&gt;&lt;span class=&quot;token&quot;&gt; &lt;/span&gt;&lt;span class=&quot;token&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;token&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token&quot;&gt; &lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #d73a49;&quot;&gt;=&amp;gt;&lt;/span&gt;&lt;span class=&quot;token&quot;&gt; &lt;/span&gt;&lt;span class=&quot;token&quot;&gt;{&lt;/span&gt;&lt;span class=&quot;token&quot;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;token&quot;&gt;        &lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #6f42c1;&quot;&gt;fail&lt;/span&gt;&lt;span class=&quot;token&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token&quot;&gt;{&lt;/span&gt;&lt;span class=&quot;token&quot;&gt; &lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #e36209;&quot;&gt;status&lt;/span&gt;&lt;span class=&quot;token&quot;&gt;,&lt;/span&gt;&lt;span class=&quot;token&quot;&gt; &lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #e36209;&quot;&gt;preventDefault&lt;/span&gt;&lt;span class=&quot;token&quot;&gt; &lt;/span&gt;&lt;span class=&quot;token&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;token&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token&quot;&gt; &lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #d73a49;&quot;&gt;=&amp;gt;&lt;/span&gt;&lt;span class=&quot;token&quot;&gt; &lt;/span&gt;&lt;span class=&quot;token&quot;&gt;{&lt;/span&gt;&lt;span class=&quot;token&quot;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;token&quot;&gt;            &lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #d73a49;&quot;&gt;if&lt;/span&gt;&lt;span class=&quot;token&quot;&gt; &lt;/span&gt;&lt;span class=&quot;token&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #24292e;&quot;&gt;status&lt;/span&gt;&lt;span class=&quot;token&quot;&gt; &lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #d73a49;&quot;&gt;===&lt;/span&gt;&lt;span class=&quot;token&quot;&gt; &lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #005cc5;&quot;&gt;404&lt;/span&gt;&lt;span class=&quot;token&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token&quot;&gt; &lt;/span&gt;&lt;span class=&quot;token&quot;&gt;{&lt;/span&gt;&lt;span class=&quot;token&quot;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;token&quot;&gt;                &lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #6a737d;&quot;&gt;//&lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #6a737d;&quot;&gt; Your preferred behaviour&lt;/span&gt;&lt;span class=&quot;token&quot;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;token&quot;&gt;                &lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #d73a49;&quot;&gt;if&lt;/span&gt;&lt;span class=&quot;token&quot;&gt; &lt;/span&gt;&lt;span class=&quot;token&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #6f42c1;&quot;&gt;confirm&lt;/span&gt;&lt;span class=&quot;token&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #032f62;&quot;&gt;&amp;#039;&lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #032f62;&quot;&gt;Ressource not found. Reload the page maybe?&lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #032f62;&quot;&gt;&amp;#039;&lt;/span&gt;&lt;span class=&quot;token&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token&quot;&gt; &lt;/span&gt;&lt;span class=&quot;token&quot;&gt;{&lt;/span&gt;&lt;span class=&quot;token&quot;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;token&quot;&gt;                    &lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #24292e;&quot;&gt;window&lt;/span&gt;&lt;span class=&quot;token&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #24292e;&quot;&gt;location&lt;/span&gt;&lt;span class=&quot;token&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #6f42c1;&quot;&gt;reload&lt;/span&gt;&lt;span class=&quot;token&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token&quot;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;token&quot;&gt;                &lt;/span&gt;&lt;span class=&quot;token&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;token&quot;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;token&quot;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;token&quot;&gt;                &lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #6a737d;&quot;&gt;//&lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #6a737d;&quot;&gt; Prevent Livewire default behaviour &lt;/span&gt;&lt;span class=&quot;token&quot;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;token&quot;&gt;                &lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #6f42c1;&quot;&gt;preventDefault&lt;/span&gt;&lt;span class=&quot;token&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token&quot;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;token&quot;&gt;            &lt;/span&gt;&lt;span class=&quot;token&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;token&quot;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;token&quot;&gt;        &lt;/span&gt;&lt;span class=&quot;token&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;token&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token&quot;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;token&quot;&gt;    &lt;/span&gt;&lt;span class=&quot;token&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;token&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token&quot;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;token&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;token&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token&quot;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;And that's basically it! If you wanna learn more on the subject, checkout the Livewire documentation on &lt;a href=&quot;https://livewire.laravel.com/docs/javascript#javascript-hooks&quot;&gt;Javascript hooks&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;As a little bonus/advanced way, here's how you can recharge just the component instead. I don't guarantee this will work in all applications, as it is a hacky way to access the Livewire request payload. Livewire can send multiple commands at once and this code may not access the correct one. This works for a full-page component with a method call, but it's a risky method and can break with a Livewire update.&lt;/p&gt;
&lt;div x-data=&quot;codeBlock&quot; class=&quot;code-block relative&quot;&gt;&lt;div class=&quot;flex space-x-2 items-center absolute top-0 right-0&quot;&gt;
    &lt;div x-cloak x-show=&quot;showMessage&quot; x-transition class=&quot;py-2 animate-bounce transition duration-300 mt-1 text-sky-500 text-xs&quot;&gt;Copied!&lt;/div&gt;
    &lt;button
        type=&quot;button&quot;
        title=&quot;Copy to clipboard&quot;
        class=&quot;hidden sm:block p-2 pl-3 transition duration-300&quot;
        @click.prevent=&quot;copyToClipboard&quot;
        :class=&quot;{
            'text-black/30 hover:text-black/80': !showMessage,
            'text-sky-500 hover:text-sky-700': showMessage,
        }&quot;&gt;
        &lt;svg xmlns=&quot;http://www.w3.org/2000/svg&quot; fill=&quot;none&quot; viewBox=&quot;0 0 24 24&quot; stroke-width=&quot;1.5&quot; stroke=&quot;currentColor&quot; class=&quot;block w-6 h-6&quot;&gt;
            &lt;path fill=&quot;white&quot; stroke-linecap=&quot;round&quot; stroke-linejoin=&quot;round&quot; d=&quot;M11.35 3.836c-.065.21-.1.433-.1.664 0 .414.336.75.75.75h4.5a.75.75 0 00.75-.75 2.25 2.25 0 00-.1-.664m-5.8 0A2.251 2.251 0 0113.5 2.25H15c1.012 0 1.867.668 2.15 1.586m-5.8 0c-.376.023-.75.05-1.124.08C9.095 4.01 8.25 4.973 8.25 6.108V8.25m8.9-4.414c.376.023.75.05 1.124.08 1.131.094 1.976 1.057 1.976 2.192V16.5A2.25 2.25 0 0118 18.75h-2.25m-7.5-10.5H4.875c-.621 0-1.125.504-1.125 1.125v11.25c0 .621.504 1.125 1.125 1.125h9.75c.621 0 1.125-.504 1.125-1.125V18.75m-7.5-10.5h6.375c.621 0 1.125.504 1.125 1.125v9.375m-8.25-3l1.5 1.5 3-3.75&quot; /&gt;
        &lt;/svg&gt;
    &lt;/button&gt;
&lt;/div&gt;&lt;pre class=&quot;phiki language-javascript github-light&quot; data-language=&quot;javascript&quot; style=&quot;background-color: #fff;color: #24292e;&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;token&quot; style=&quot;color: #d73a49;&quot;&gt;if&lt;/span&gt;&lt;span class=&quot;token&quot;&gt; &lt;/span&gt;&lt;span class=&quot;token&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #6f42c1;&quot;&gt;confirm&lt;/span&gt;&lt;span class=&quot;token&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #032f62;&quot;&gt;&amp;#039;&lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #032f62;&quot;&gt;Ressource not found. Reload the component maybe?&lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #032f62;&quot;&gt;&amp;#039;&lt;/span&gt;&lt;span class=&quot;token&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token&quot;&gt; &lt;/span&gt;&lt;span class=&quot;token&quot;&gt;{&lt;/span&gt;&lt;span class=&quot;token&quot;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;token&quot;&gt;  &lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #d73a49;&quot;&gt;let&lt;/span&gt;&lt;span class=&quot;token&quot;&gt; &lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #24292e;&quot;&gt;object&lt;/span&gt;&lt;span class=&quot;token&quot;&gt; &lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #d73a49;&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;token&quot;&gt; &lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #005cc5;&quot;&gt;JSON&lt;/span&gt;&lt;span class=&quot;token&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #6f42c1;&quot;&gt;parse&lt;/span&gt;&lt;span class=&quot;token&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #24292e;&quot;&gt;payload&lt;/span&gt;&lt;span class=&quot;token&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token&quot;&gt;;&lt;/span&gt;&lt;span class=&quot;token&quot;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;token&quot;&gt;  &lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #d73a49;&quot;&gt;let&lt;/span&gt;&lt;span class=&quot;token&quot;&gt; &lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #24292e;&quot;&gt;snapshot&lt;/span&gt;&lt;span class=&quot;token&quot;&gt; &lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #d73a49;&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;token&quot;&gt; &lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #005cc5;&quot;&gt;JSON&lt;/span&gt;&lt;span class=&quot;token&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #6f42c1;&quot;&gt;parse&lt;/span&gt;&lt;span class=&quot;token&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #24292e;&quot;&gt;object&lt;/span&gt;&lt;span class=&quot;token&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #24292e;&quot;&gt;components&lt;/span&gt;&lt;span class=&quot;token&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #005cc5;&quot;&gt;0&lt;/span&gt;&lt;span class=&quot;token&quot;&gt;]&lt;/span&gt;&lt;span class=&quot;token&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #24292e;&quot;&gt;snapshot&lt;/span&gt;&lt;span class=&quot;token&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token&quot;&gt;;&lt;/span&gt;&lt;span class=&quot;token&quot;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;token&quot;&gt;  &lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #d73a49;&quot;&gt;let&lt;/span&gt;&lt;span class=&quot;token&quot;&gt; &lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #24292e;&quot;&gt;component&lt;/span&gt;&lt;span class=&quot;token&quot;&gt; &lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #d73a49;&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;token&quot;&gt; &lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #24292e;&quot;&gt;Livewire&lt;/span&gt;&lt;span class=&quot;token&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #6f42c1;&quot;&gt;find&lt;/span&gt;&lt;span class=&quot;token&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #24292e;&quot;&gt;snapshot&lt;/span&gt;&lt;span class=&quot;token&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #24292e;&quot;&gt;memo&lt;/span&gt;&lt;span class=&quot;token&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #24292e;&quot;&gt;id&lt;/span&gt;&lt;span class=&quot;token&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token&quot;&gt;;&lt;/span&gt;&lt;span class=&quot;token&quot;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;token&quot;&gt;  &lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #24292e;&quot;&gt;component&lt;/span&gt;&lt;span class=&quot;token&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #6f42c1;&quot;&gt;$refresh&lt;/span&gt;&lt;span class=&quot;token&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token&quot;&gt;;&lt;/span&gt;&lt;span class=&quot;token&quot;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;token&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;token&quot;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;Have a nice day!&lt;/p&gt;</summary>
        <content type="html">&lt;p&gt;I like to use the findOrFail() function in Livewire methods that call actions. But I really don't like the default behaviour of Livewire showing a modal view with a 404. Let me show you how to personalise that.&lt;/p&gt;
&lt;!--more--&gt;
&lt;p&gt;This is a short solution, simply copy this code into your &lt;code&gt;app.js&lt;/code&gt; (or in a &lt;code&gt;&amp;lt;script&amp;gt;&lt;/code&gt; tag if you want different behaviour through your app) and customize it with a modal or notification for your user. What makes the most sense for your application.&lt;/p&gt;
&lt;p&gt;Since I'm using it in a CRUD context here, here is a simple and effective code.&lt;/p&gt;
&lt;div x-data=&quot;codeBlock&quot; class=&quot;code-block relative&quot;&gt;&lt;div class=&quot;flex space-x-2 items-center absolute top-0 right-0&quot;&gt;
    &lt;div x-cloak x-show=&quot;showMessage&quot; x-transition class=&quot;py-2 animate-bounce transition duration-300 mt-1 text-sky-500 text-xs&quot;&gt;Copied!&lt;/div&gt;
    &lt;button
        type=&quot;button&quot;
        title=&quot;Copy to clipboard&quot;
        class=&quot;hidden sm:block p-2 pl-3 transition duration-300&quot;
        @click.prevent=&quot;copyToClipboard&quot;
        :class=&quot;{
            'text-black/30 hover:text-black/80': !showMessage,
            'text-sky-500 hover:text-sky-700': showMessage,
        }&quot;&gt;
        &lt;svg xmlns=&quot;http://www.w3.org/2000/svg&quot; fill=&quot;none&quot; viewBox=&quot;0 0 24 24&quot; stroke-width=&quot;1.5&quot; stroke=&quot;currentColor&quot; class=&quot;block w-6 h-6&quot;&gt;
            &lt;path fill=&quot;white&quot; stroke-linecap=&quot;round&quot; stroke-linejoin=&quot;round&quot; d=&quot;M11.35 3.836c-.065.21-.1.433-.1.664 0 .414.336.75.75.75h4.5a.75.75 0 00.75-.75 2.25 2.25 0 00-.1-.664m-5.8 0A2.251 2.251 0 0113.5 2.25H15c1.012 0 1.867.668 2.15 1.586m-5.8 0c-.376.023-.75.05-1.124.08C9.095 4.01 8.25 4.973 8.25 6.108V8.25m8.9-4.414c.376.023.75.05 1.124.08 1.131.094 1.976 1.057 1.976 2.192V16.5A2.25 2.25 0 0118 18.75h-2.25m-7.5-10.5H4.875c-.621 0-1.125.504-1.125 1.125v11.25c0 .621.504 1.125 1.125 1.125h9.75c.621 0 1.125-.504 1.125-1.125V18.75m-7.5-10.5h6.375c.621 0 1.125.504 1.125 1.125v9.375m-8.25-3l1.5 1.5 3-3.75&quot; /&gt;
        &lt;/svg&gt;
    &lt;/button&gt;
&lt;/div&gt;&lt;pre class=&quot;phiki language-javascript github-light&quot; data-language=&quot;javascript&quot; style=&quot;background-color: #fff;color: #24292e;&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;token&quot; style=&quot;color: #24292e;&quot;&gt;document&lt;/span&gt;&lt;span class=&quot;token&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #6f42c1;&quot;&gt;addEventListener&lt;/span&gt;&lt;span class=&quot;token&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #032f62;&quot;&gt;&amp;#039;&lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #032f62;&quot;&gt;livewire:init&lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #032f62;&quot;&gt;&amp;#039;&lt;/span&gt;&lt;span class=&quot;token&quot;&gt;,&lt;/span&gt;&lt;span class=&quot;token&quot;&gt; &lt;/span&gt;&lt;span class=&quot;token&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token&quot;&gt; &lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #d73a49;&quot;&gt;=&amp;gt;&lt;/span&gt;&lt;span class=&quot;token&quot;&gt; &lt;/span&gt;&lt;span class=&quot;token&quot;&gt;{&lt;/span&gt;&lt;span class=&quot;token&quot;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;token&quot;&gt;    &lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #24292e;&quot;&gt;Livewire&lt;/span&gt;&lt;span class=&quot;token&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #6f42c1;&quot;&gt;hook&lt;/span&gt;&lt;span class=&quot;token&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #032f62;&quot;&gt;&amp;#039;&lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #032f62;&quot;&gt;request&lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #032f62;&quot;&gt;&amp;#039;&lt;/span&gt;&lt;span class=&quot;token&quot;&gt;,&lt;/span&gt;&lt;span class=&quot;token&quot;&gt; &lt;/span&gt;&lt;span class=&quot;token&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token&quot;&gt;{&lt;/span&gt;&lt;span class=&quot;token&quot;&gt; &lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #e36209;&quot;&gt;fail&lt;/span&gt;&lt;span class=&quot;token&quot;&gt; &lt;/span&gt;&lt;span class=&quot;token&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;token&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token&quot;&gt; &lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #d73a49;&quot;&gt;=&amp;gt;&lt;/span&gt;&lt;span class=&quot;token&quot;&gt; &lt;/span&gt;&lt;span class=&quot;token&quot;&gt;{&lt;/span&gt;&lt;span class=&quot;token&quot;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;token&quot;&gt;        &lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #6f42c1;&quot;&gt;fail&lt;/span&gt;&lt;span class=&quot;token&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token&quot;&gt;{&lt;/span&gt;&lt;span class=&quot;token&quot;&gt; &lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #e36209;&quot;&gt;status&lt;/span&gt;&lt;span class=&quot;token&quot;&gt;,&lt;/span&gt;&lt;span class=&quot;token&quot;&gt; &lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #e36209;&quot;&gt;preventDefault&lt;/span&gt;&lt;span class=&quot;token&quot;&gt; &lt;/span&gt;&lt;span class=&quot;token&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;token&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token&quot;&gt; &lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #d73a49;&quot;&gt;=&amp;gt;&lt;/span&gt;&lt;span class=&quot;token&quot;&gt; &lt;/span&gt;&lt;span class=&quot;token&quot;&gt;{&lt;/span&gt;&lt;span class=&quot;token&quot;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;token&quot;&gt;            &lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #d73a49;&quot;&gt;if&lt;/span&gt;&lt;span class=&quot;token&quot;&gt; &lt;/span&gt;&lt;span class=&quot;token&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #24292e;&quot;&gt;status&lt;/span&gt;&lt;span class=&quot;token&quot;&gt; &lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #d73a49;&quot;&gt;===&lt;/span&gt;&lt;span class=&quot;token&quot;&gt; &lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #005cc5;&quot;&gt;404&lt;/span&gt;&lt;span class=&quot;token&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token&quot;&gt; &lt;/span&gt;&lt;span class=&quot;token&quot;&gt;{&lt;/span&gt;&lt;span class=&quot;token&quot;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;token&quot;&gt;                &lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #6a737d;&quot;&gt;//&lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #6a737d;&quot;&gt; Your preferred behaviour&lt;/span&gt;&lt;span class=&quot;token&quot;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;token&quot;&gt;                &lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #d73a49;&quot;&gt;if&lt;/span&gt;&lt;span class=&quot;token&quot;&gt; &lt;/span&gt;&lt;span class=&quot;token&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #6f42c1;&quot;&gt;confirm&lt;/span&gt;&lt;span class=&quot;token&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #032f62;&quot;&gt;&amp;#039;&lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #032f62;&quot;&gt;Ressource not found. Reload the page maybe?&lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #032f62;&quot;&gt;&amp;#039;&lt;/span&gt;&lt;span class=&quot;token&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token&quot;&gt; &lt;/span&gt;&lt;span class=&quot;token&quot;&gt;{&lt;/span&gt;&lt;span class=&quot;token&quot;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;token&quot;&gt;                    &lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #24292e;&quot;&gt;window&lt;/span&gt;&lt;span class=&quot;token&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #24292e;&quot;&gt;location&lt;/span&gt;&lt;span class=&quot;token&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #6f42c1;&quot;&gt;reload&lt;/span&gt;&lt;span class=&quot;token&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token&quot;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;token&quot;&gt;                &lt;/span&gt;&lt;span class=&quot;token&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;token&quot;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;token&quot;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;token&quot;&gt;                &lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #6a737d;&quot;&gt;//&lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #6a737d;&quot;&gt; Prevent Livewire default behaviour &lt;/span&gt;&lt;span class=&quot;token&quot;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;token&quot;&gt;                &lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #6f42c1;&quot;&gt;preventDefault&lt;/span&gt;&lt;span class=&quot;token&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token&quot;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;token&quot;&gt;            &lt;/span&gt;&lt;span class=&quot;token&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;token&quot;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;token&quot;&gt;        &lt;/span&gt;&lt;span class=&quot;token&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;token&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token&quot;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;token&quot;&gt;    &lt;/span&gt;&lt;span class=&quot;token&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;token&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token&quot;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;token&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;token&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token&quot;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;And that's basically it! If you wanna learn more on the subject, checkout the Livewire documentation on &lt;a href=&quot;https://livewire.laravel.com/docs/javascript#javascript-hooks&quot;&gt;Javascript hooks&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;As a little bonus/advanced way, here's how you can recharge just the component instead. I don't guarantee this will work in all applications, as it is a hacky way to access the Livewire request payload. Livewire can send multiple commands at once and this code may not access the correct one. This works for a full-page component with a method call, but it's a risky method and can break with a Livewire update.&lt;/p&gt;
&lt;div x-data=&quot;codeBlock&quot; class=&quot;code-block relative&quot;&gt;&lt;div class=&quot;flex space-x-2 items-center absolute top-0 right-0&quot;&gt;
    &lt;div x-cloak x-show=&quot;showMessage&quot; x-transition class=&quot;py-2 animate-bounce transition duration-300 mt-1 text-sky-500 text-xs&quot;&gt;Copied!&lt;/div&gt;
    &lt;button
        type=&quot;button&quot;
        title=&quot;Copy to clipboard&quot;
        class=&quot;hidden sm:block p-2 pl-3 transition duration-300&quot;
        @click.prevent=&quot;copyToClipboard&quot;
        :class=&quot;{
            'text-black/30 hover:text-black/80': !showMessage,
            'text-sky-500 hover:text-sky-700': showMessage,
        }&quot;&gt;
        &lt;svg xmlns=&quot;http://www.w3.org/2000/svg&quot; fill=&quot;none&quot; viewBox=&quot;0 0 24 24&quot; stroke-width=&quot;1.5&quot; stroke=&quot;currentColor&quot; class=&quot;block w-6 h-6&quot;&gt;
            &lt;path fill=&quot;white&quot; stroke-linecap=&quot;round&quot; stroke-linejoin=&quot;round&quot; d=&quot;M11.35 3.836c-.065.21-.1.433-.1.664 0 .414.336.75.75.75h4.5a.75.75 0 00.75-.75 2.25 2.25 0 00-.1-.664m-5.8 0A2.251 2.251 0 0113.5 2.25H15c1.012 0 1.867.668 2.15 1.586m-5.8 0c-.376.023-.75.05-1.124.08C9.095 4.01 8.25 4.973 8.25 6.108V8.25m8.9-4.414c.376.023.75.05 1.124.08 1.131.094 1.976 1.057 1.976 2.192V16.5A2.25 2.25 0 0118 18.75h-2.25m-7.5-10.5H4.875c-.621 0-1.125.504-1.125 1.125v11.25c0 .621.504 1.125 1.125 1.125h9.75c.621 0 1.125-.504 1.125-1.125V18.75m-7.5-10.5h6.375c.621 0 1.125.504 1.125 1.125v9.375m-8.25-3l1.5 1.5 3-3.75&quot; /&gt;
        &lt;/svg&gt;
    &lt;/button&gt;
&lt;/div&gt;&lt;pre class=&quot;phiki language-javascript github-light&quot; data-language=&quot;javascript&quot; style=&quot;background-color: #fff;color: #24292e;&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;token&quot; style=&quot;color: #d73a49;&quot;&gt;if&lt;/span&gt;&lt;span class=&quot;token&quot;&gt; &lt;/span&gt;&lt;span class=&quot;token&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #6f42c1;&quot;&gt;confirm&lt;/span&gt;&lt;span class=&quot;token&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #032f62;&quot;&gt;&amp;#039;&lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #032f62;&quot;&gt;Ressource not found. Reload the component maybe?&lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #032f62;&quot;&gt;&amp;#039;&lt;/span&gt;&lt;span class=&quot;token&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token&quot;&gt; &lt;/span&gt;&lt;span class=&quot;token&quot;&gt;{&lt;/span&gt;&lt;span class=&quot;token&quot;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;token&quot;&gt;  &lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #d73a49;&quot;&gt;let&lt;/span&gt;&lt;span class=&quot;token&quot;&gt; &lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #24292e;&quot;&gt;object&lt;/span&gt;&lt;span class=&quot;token&quot;&gt; &lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #d73a49;&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;token&quot;&gt; &lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #005cc5;&quot;&gt;JSON&lt;/span&gt;&lt;span class=&quot;token&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #6f42c1;&quot;&gt;parse&lt;/span&gt;&lt;span class=&quot;token&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #24292e;&quot;&gt;payload&lt;/span&gt;&lt;span class=&quot;token&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token&quot;&gt;;&lt;/span&gt;&lt;span class=&quot;token&quot;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;token&quot;&gt;  &lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #d73a49;&quot;&gt;let&lt;/span&gt;&lt;span class=&quot;token&quot;&gt; &lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #24292e;&quot;&gt;snapshot&lt;/span&gt;&lt;span class=&quot;token&quot;&gt; &lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #d73a49;&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;token&quot;&gt; &lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #005cc5;&quot;&gt;JSON&lt;/span&gt;&lt;span class=&quot;token&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #6f42c1;&quot;&gt;parse&lt;/span&gt;&lt;span class=&quot;token&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #24292e;&quot;&gt;object&lt;/span&gt;&lt;span class=&quot;token&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #24292e;&quot;&gt;components&lt;/span&gt;&lt;span class=&quot;token&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #005cc5;&quot;&gt;0&lt;/span&gt;&lt;span class=&quot;token&quot;&gt;]&lt;/span&gt;&lt;span class=&quot;token&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #24292e;&quot;&gt;snapshot&lt;/span&gt;&lt;span class=&quot;token&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token&quot;&gt;;&lt;/span&gt;&lt;span class=&quot;token&quot;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;token&quot;&gt;  &lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #d73a49;&quot;&gt;let&lt;/span&gt;&lt;span class=&quot;token&quot;&gt; &lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #24292e;&quot;&gt;component&lt;/span&gt;&lt;span class=&quot;token&quot;&gt; &lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #d73a49;&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;token&quot;&gt; &lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #24292e;&quot;&gt;Livewire&lt;/span&gt;&lt;span class=&quot;token&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #6f42c1;&quot;&gt;find&lt;/span&gt;&lt;span class=&quot;token&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #24292e;&quot;&gt;snapshot&lt;/span&gt;&lt;span class=&quot;token&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #24292e;&quot;&gt;memo&lt;/span&gt;&lt;span class=&quot;token&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #24292e;&quot;&gt;id&lt;/span&gt;&lt;span class=&quot;token&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token&quot;&gt;;&lt;/span&gt;&lt;span class=&quot;token&quot;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;token&quot;&gt;  &lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #24292e;&quot;&gt;component&lt;/span&gt;&lt;span class=&quot;token&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #6f42c1;&quot;&gt;$refresh&lt;/span&gt;&lt;span class=&quot;token&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token&quot;&gt;;&lt;/span&gt;&lt;span class=&quot;token&quot;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;token&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;token&quot;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;Have a nice day!&lt;/p&gt;</content>
        <author>
            <name>Eser DENIZ</name>
        </author>
    </entry>
    <entry>
        <title type="text">How to have transition working with dynamic list on Livewire</title>
        <link href="https://srwiez.com/posts/how-to-have-transition-working-with-dynamic-list-on-livewire"/>
        <id>https://srwiez.com/posts/how-to-have-transition-working-with-dynamic-list-on-livewire</id>
        <published>2024-02-11T00:00:00+00:00</published>
        <updated>2024-02-11T12:51:44+00:00</updated>
        <summary type="text">&lt;p&gt;If you have tried to use &lt;code&gt;wire:transition&lt;/code&gt; in a loop in Livewire, you may have seen some weird behaiour. It's because of &lt;a href=&quot;https://livewire.laravel.com/docs/wire-transition#limitations&quot;&gt;limitation&lt;/a&gt; recently documented on Livewire. But no worries, I have a workaround for you!&lt;/p&gt;
&lt;!--more--&gt;
&lt;p&gt;The solution is simple, we are gonna use &lt;a href=&quot;https://auto-animate.formkit.com&quot;&gt;AutoAnimate.js&lt;/a&gt; and to be more precise &lt;a href=&quot;https://github.com/marcreichel/alpine-auto-animate&quot;&gt;alpine-auto-animate&lt;/a&gt; wich is a Alpine.js wrapper.&lt;/p&gt;
&lt;ul class=&quot;table-of-contents not-prose&quot;&gt;
&lt;li&gt;&lt;a href=&quot;#content-installation&quot;&gt;Installation&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;#content-using-auto-animate-with-livewire&quot;&gt;Using auto animate with Livewire&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;&lt;a id=&quot;content-installation&quot; href=&quot;#content-installation&quot; class=&quot;heading-permalink&quot; aria-hidden=&quot;true&quot; tabindex=&quot;-1&quot; title=&quot;Permalink&quot;&gt;#&lt;/a&gt;Installation&lt;/h2&gt;
&lt;p&gt;The easiest way is to use the cdn to install the library&lt;/p&gt;
&lt;div x-data=&quot;codeBlock&quot; class=&quot;code-block relative&quot;&gt;&lt;div class=&quot;flex space-x-2 items-center absolute top-0 right-0&quot;&gt;
    &lt;div x-cloak x-show=&quot;showMessage&quot; x-transition class=&quot;py-2 animate-bounce transition duration-300 mt-1 text-sky-500 text-xs&quot;&gt;Copied!&lt;/div&gt;
    &lt;button
        type=&quot;button&quot;
        title=&quot;Copy to clipboard&quot;
        class=&quot;hidden sm:block p-2 pl-3 transition duration-300&quot;
        @click.prevent=&quot;copyToClipboard&quot;
        :class=&quot;{
            'text-black/30 hover:text-black/80': !showMessage,
            'text-sky-500 hover:text-sky-700': showMessage,
        }&quot;&gt;
        &lt;svg xmlns=&quot;http://www.w3.org/2000/svg&quot; fill=&quot;none&quot; viewBox=&quot;0 0 24 24&quot; stroke-width=&quot;1.5&quot; stroke=&quot;currentColor&quot; class=&quot;block w-6 h-6&quot;&gt;
            &lt;path fill=&quot;white&quot; stroke-linecap=&quot;round&quot; stroke-linejoin=&quot;round&quot; d=&quot;M11.35 3.836c-.065.21-.1.433-.1.664 0 .414.336.75.75.75h4.5a.75.75 0 00.75-.75 2.25 2.25 0 00-.1-.664m-5.8 0A2.251 2.251 0 0113.5 2.25H15c1.012 0 1.867.668 2.15 1.586m-5.8 0c-.376.023-.75.05-1.124.08C9.095 4.01 8.25 4.973 8.25 6.108V8.25m8.9-4.414c.376.023.75.05 1.124.08 1.131.094 1.976 1.057 1.976 2.192V16.5A2.25 2.25 0 0118 18.75h-2.25m-7.5-10.5H4.875c-.621 0-1.125.504-1.125 1.125v11.25c0 .621.504 1.125 1.125 1.125h9.75c.621 0 1.125-.504 1.125-1.125V18.75m-7.5-10.5h6.375c.621 0 1.125.504 1.125 1.125v9.375m-8.25-3l1.5 1.5 3-3.75&quot; /&gt;
        &lt;/svg&gt;
    &lt;/button&gt;
&lt;/div&gt;&lt;pre class=&quot;phiki language-html github-light&quot; data-language=&quot;html&quot; style=&quot;background-color: #fff;color: #24292e;&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;token&quot;&gt;&amp;lt;&lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #22863a;&quot;&gt;script&lt;/span&gt;&lt;span class=&quot;token&quot;&gt; &lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #6f42c1;&quot;&gt;src&lt;/span&gt;&lt;span class=&quot;token&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #032f62;&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #032f62;&quot;&gt;https://cdn.jsdelivr.net/npm/@marcreichel/alpine-auto-animate@latest/dist/alpine-auto-animate.min.js&lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #032f62;&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span class=&quot;token&quot;&gt; &lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #6f42c1;&quot;&gt;defer&lt;/span&gt;&lt;span class=&quot;token&quot;&gt;&amp;gt;&lt;/span&gt;&lt;span class=&quot;token&quot;&gt;&amp;lt;&lt;/span&gt;&lt;span class=&quot;token&quot;&gt;/&lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #22863a;&quot;&gt;script&lt;/span&gt;&lt;span class=&quot;token&quot;&gt;&amp;gt;&lt;/span&gt;&lt;span class=&quot;token&quot;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;But I didn't go the easy way, I prefer to package all in my own project. So we will have to follow Livewire documentation on &lt;a href=&quot;https://livewire.laravel.com/docs/installation#manually-bundling-livewire-and-alpine&quot;&gt;manually bundling Livewire and Alpine&lt;/a&gt;, then add alpine auto animate plugin.&lt;/p&gt;
&lt;p&gt;Your &lt;code&gt;app.js&lt;/code&gt; will now import Livewire and Alpine manually so you can add one or more plugins before Livewire start.&lt;/p&gt;
&lt;div x-data=&quot;codeBlock&quot; class=&quot;code-block relative&quot;&gt;&lt;div class=&quot;flex space-x-2 items-center absolute top-0 right-0&quot;&gt;
    &lt;div x-cloak x-show=&quot;showMessage&quot; x-transition class=&quot;py-2 animate-bounce transition duration-300 mt-1 text-sky-500 text-xs&quot;&gt;Copied!&lt;/div&gt;
    &lt;button
        type=&quot;button&quot;
        title=&quot;Copy to clipboard&quot;
        class=&quot;hidden sm:block p-2 pl-3 transition duration-300&quot;
        @click.prevent=&quot;copyToClipboard&quot;
        :class=&quot;{
            'text-black/30 hover:text-black/80': !showMessage,
            'text-sky-500 hover:text-sky-700': showMessage,
        }&quot;&gt;
        &lt;svg xmlns=&quot;http://www.w3.org/2000/svg&quot; fill=&quot;none&quot; viewBox=&quot;0 0 24 24&quot; stroke-width=&quot;1.5&quot; stroke=&quot;currentColor&quot; class=&quot;block w-6 h-6&quot;&gt;
            &lt;path fill=&quot;white&quot; stroke-linecap=&quot;round&quot; stroke-linejoin=&quot;round&quot; d=&quot;M11.35 3.836c-.065.21-.1.433-.1.664 0 .414.336.75.75.75h4.5a.75.75 0 00.75-.75 2.25 2.25 0 00-.1-.664m-5.8 0A2.251 2.251 0 0113.5 2.25H15c1.012 0 1.867.668 2.15 1.586m-5.8 0c-.376.023-.75.05-1.124.08C9.095 4.01 8.25 4.973 8.25 6.108V8.25m8.9-4.414c.376.023.75.05 1.124.08 1.131.094 1.976 1.057 1.976 2.192V16.5A2.25 2.25 0 0118 18.75h-2.25m-7.5-10.5H4.875c-.621 0-1.125.504-1.125 1.125v11.25c0 .621.504 1.125 1.125 1.125h9.75c.621 0 1.125-.504 1.125-1.125V18.75m-7.5-10.5h6.375c.621 0 1.125.504 1.125 1.125v9.375m-8.25-3l1.5 1.5 3-3.75&quot; /&gt;
        &lt;/svg&gt;
    &lt;/button&gt;
&lt;/div&gt;&lt;pre class=&quot;phiki language-javascript github-light&quot; data-language=&quot;javascript&quot; style=&quot;background-color: #fff;color: #24292e;&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;token&quot; style=&quot;color: #d73a49;&quot;&gt;import&lt;/span&gt;&lt;span class=&quot;token&quot;&gt; &lt;/span&gt;&lt;span class=&quot;token&quot;&gt;{&lt;/span&gt;&lt;span class=&quot;token&quot;&gt; &lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #24292e;&quot;&gt;Livewire&lt;/span&gt;&lt;span class=&quot;token&quot;&gt;,&lt;/span&gt;&lt;span class=&quot;token&quot;&gt; &lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #24292e;&quot;&gt;Alpine&lt;/span&gt;&lt;span class=&quot;token&quot;&gt; &lt;/span&gt;&lt;span class=&quot;token&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;token&quot;&gt; &lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #d73a49;&quot;&gt;from&lt;/span&gt;&lt;span class=&quot;token&quot;&gt; &lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #032f62;&quot;&gt;&amp;#039;&lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #032f62;&quot;&gt;../../vendor/livewire/livewire/dist/livewire.esm&lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #032f62;&quot;&gt;&amp;#039;&lt;/span&gt;&lt;span class=&quot;token&quot;&gt;;&lt;/span&gt;&lt;span class=&quot;token&quot;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;token&quot; style=&quot;color: #d73a49;&quot;&gt;import&lt;/span&gt;&lt;span class=&quot;token&quot;&gt; &lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #24292e;&quot;&gt;AutoAnimate&lt;/span&gt;&lt;span class=&quot;token&quot;&gt; &lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #d73a49;&quot;&gt;from&lt;/span&gt;&lt;span class=&quot;token&quot;&gt; &lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #032f62;&quot;&gt;&amp;#039;&lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #032f62;&quot;&gt;@marcreichel/alpine-auto-animate&lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #032f62;&quot;&gt;&amp;#039;&lt;/span&gt;&lt;span class=&quot;token&quot;&gt;;&lt;/span&gt;&lt;span class=&quot;token&quot;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;token&quot;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;token&quot; style=&quot;color: #24292e;&quot;&gt;Alpine&lt;/span&gt;&lt;span class=&quot;token&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #6f42c1;&quot;&gt;plugin&lt;/span&gt;&lt;span class=&quot;token&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #24292e;&quot;&gt;AutoAnimate&lt;/span&gt;&lt;span class=&quot;token&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token&quot;&gt;;&lt;/span&gt;&lt;span class=&quot;token&quot;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;token&quot;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;token&quot; style=&quot;color: #24292e;&quot;&gt;Livewire&lt;/span&gt;&lt;span class=&quot;token&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #6f42c1;&quot;&gt;start&lt;/span&gt;&lt;span class=&quot;token&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token&quot;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;And your blade layout should include two new blade tags&lt;/p&gt;
&lt;div x-data=&quot;codeBlock&quot; class=&quot;code-block relative&quot;&gt;&lt;div class=&quot;flex space-x-2 items-center absolute top-0 right-0&quot;&gt;
    &lt;div x-cloak x-show=&quot;showMessage&quot; x-transition class=&quot;py-2 animate-bounce transition duration-300 mt-1 text-sky-500 text-xs&quot;&gt;Copied!&lt;/div&gt;
    &lt;button
        type=&quot;button&quot;
        title=&quot;Copy to clipboard&quot;
        class=&quot;hidden sm:block p-2 pl-3 transition duration-300&quot;
        @click.prevent=&quot;copyToClipboard&quot;
        :class=&quot;{
            'text-black/30 hover:text-black/80': !showMessage,
            'text-sky-500 hover:text-sky-700': showMessage,
        }&quot;&gt;
        &lt;svg xmlns=&quot;http://www.w3.org/2000/svg&quot; fill=&quot;none&quot; viewBox=&quot;0 0 24 24&quot; stroke-width=&quot;1.5&quot; stroke=&quot;currentColor&quot; class=&quot;block w-6 h-6&quot;&gt;
            &lt;path fill=&quot;white&quot; stroke-linecap=&quot;round&quot; stroke-linejoin=&quot;round&quot; d=&quot;M11.35 3.836c-.065.21-.1.433-.1.664 0 .414.336.75.75.75h4.5a.75.75 0 00.75-.75 2.25 2.25 0 00-.1-.664m-5.8 0A2.251 2.251 0 0113.5 2.25H15c1.012 0 1.867.668 2.15 1.586m-5.8 0c-.376.023-.75.05-1.124.08C9.095 4.01 8.25 4.973 8.25 6.108V8.25m8.9-4.414c.376.023.75.05 1.124.08 1.131.094 1.976 1.057 1.976 2.192V16.5A2.25 2.25 0 0118 18.75h-2.25m-7.5-10.5H4.875c-.621 0-1.125.504-1.125 1.125v11.25c0 .621.504 1.125 1.125 1.125h9.75c.621 0 1.125-.504 1.125-1.125V18.75m-7.5-10.5h6.375c.621 0 1.125.504 1.125 1.125v9.375m-8.25-3l1.5 1.5 3-3.75&quot; /&gt;
        &lt;/svg&gt;
    &lt;/button&gt;
&lt;/div&gt;&lt;pre class=&quot;phiki language-blade github-light&quot; data-language=&quot;blade&quot; style=&quot;background-color: #fff;color: #24292e;--phiki-diff-insert-bg: #f0fff4;--phiki-diff-insert-fg: #22863a;&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;token&quot;&gt;&amp;lt;&lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #22863a;&quot;&gt;html&lt;/span&gt;&lt;span class=&quot;token&quot;&gt;&amp;gt;&lt;/span&gt;&lt;span class=&quot;token&quot;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;token&quot;&gt;&amp;lt;&lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #22863a;&quot;&gt;head&lt;/span&gt;&lt;span class=&quot;token&quot;&gt;&amp;gt;&lt;/span&gt;&lt;span class=&quot;token&quot;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;line insert&quot;&gt;&lt;span class=&quot;token&quot;&gt;    &lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #d73a49;&quot;&gt;@livewireStyles&lt;/span&gt;&lt;span class=&quot;token&quot;&gt; 
&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;token&quot;&gt;    &lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #d73a49;&quot;&gt;@vite&lt;/span&gt;&lt;span class=&quot;token&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #032f62;&quot;&gt;&amp;#039;&lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #032f62;&quot;&gt;resources/js/app.js&lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #032f62;&quot;&gt;&amp;#039;&lt;/span&gt;&lt;span class=&quot;token&quot;&gt;]&lt;/span&gt;&lt;span class=&quot;token&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token&quot;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;token&quot;&gt;&amp;lt;/&lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #22863a;&quot;&gt;head&lt;/span&gt;&lt;span class=&quot;token&quot;&gt;&amp;gt;&lt;/span&gt;&lt;span class=&quot;token&quot;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;token&quot;&gt;&amp;lt;&lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #22863a;&quot;&gt;body&lt;/span&gt;&lt;span class=&quot;token&quot;&gt;&amp;gt;&lt;/span&gt;&lt;span class=&quot;token&quot;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;token&quot;&gt;    &lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #005cc5;&quot;&gt;{{&lt;/span&gt;&lt;span class=&quot;token&quot;&gt; &lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #24292e;&quot;&gt;$&lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #24292e;&quot;&gt;slot&lt;/span&gt;&lt;span class=&quot;token&quot;&gt; &lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #005cc5;&quot;&gt;}}&lt;/span&gt;&lt;span class=&quot;token&quot;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;token&quot;&gt; 
&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;line insert&quot;&gt;&lt;span class=&quot;token&quot;&gt;    &lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #6f42c1;&quot;&gt;@livewireScriptConfig&lt;/span&gt;&lt;span class=&quot;token&quot;&gt; 
&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;token&quot;&gt;&amp;lt;/&lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #22863a;&quot;&gt;body&lt;/span&gt;&lt;span class=&quot;token&quot;&gt;&amp;gt;&lt;/span&gt;&lt;span class=&quot;token&quot;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;token&quot;&gt;&amp;lt;/&lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #22863a;&quot;&gt;html&lt;/span&gt;&lt;span class=&quot;token&quot;&gt;&amp;gt;&lt;/span&gt;&lt;span class=&quot;token&quot;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;h2&gt;&lt;a id=&quot;content-using-auto-animate-with-livewire&quot; href=&quot;#content-using-auto-animate-with-livewire&quot; class=&quot;heading-permalink&quot; aria-hidden=&quot;true&quot; tabindex=&quot;-1&quot; title=&quot;Permalink&quot;&gt;#&lt;/a&gt;Using auto animate with Livewire&lt;/h2&gt;
&lt;p&gt;So before, you probably tried something like that&lt;/p&gt;
&lt;div x-data=&quot;codeBlock&quot; class=&quot;code-block relative&quot;&gt;&lt;div class=&quot;flex space-x-2 items-center absolute top-0 right-0&quot;&gt;
    &lt;div x-cloak x-show=&quot;showMessage&quot; x-transition class=&quot;py-2 animate-bounce transition duration-300 mt-1 text-sky-500 text-xs&quot;&gt;Copied!&lt;/div&gt;
    &lt;button
        type=&quot;button&quot;
        title=&quot;Copy to clipboard&quot;
        class=&quot;hidden sm:block p-2 pl-3 transition duration-300&quot;
        @click.prevent=&quot;copyToClipboard&quot;
        :class=&quot;{
            'text-black/30 hover:text-black/80': !showMessage,
            'text-sky-500 hover:text-sky-700': showMessage,
        }&quot;&gt;
        &lt;svg xmlns=&quot;http://www.w3.org/2000/svg&quot; fill=&quot;none&quot; viewBox=&quot;0 0 24 24&quot; stroke-width=&quot;1.5&quot; stroke=&quot;currentColor&quot; class=&quot;block w-6 h-6&quot;&gt;
            &lt;path fill=&quot;white&quot; stroke-linecap=&quot;round&quot; stroke-linejoin=&quot;round&quot; d=&quot;M11.35 3.836c-.065.21-.1.433-.1.664 0 .414.336.75.75.75h4.5a.75.75 0 00.75-.75 2.25 2.25 0 00-.1-.664m-5.8 0A2.251 2.251 0 0113.5 2.25H15c1.012 0 1.867.668 2.15 1.586m-5.8 0c-.376.023-.75.05-1.124.08C9.095 4.01 8.25 4.973 8.25 6.108V8.25m8.9-4.414c.376.023.75.05 1.124.08 1.131.094 1.976 1.057 1.976 2.192V16.5A2.25 2.25 0 0118 18.75h-2.25m-7.5-10.5H4.875c-.621 0-1.125.504-1.125 1.125v11.25c0 .621.504 1.125 1.125 1.125h9.75c.621 0 1.125-.504 1.125-1.125V18.75m-7.5-10.5h6.375c.621 0 1.125.504 1.125 1.125v9.375m-8.25-3l1.5 1.5 3-3.75&quot; /&gt;
        &lt;/svg&gt;
    &lt;/button&gt;
&lt;/div&gt;&lt;pre class=&quot;phiki language-blade github-light&quot; data-language=&quot;blade&quot; style=&quot;background-color: #fff;color: #24292e;&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;token&quot;&gt;&amp;lt;&lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #22863a;&quot;&gt;ul&lt;/span&gt;&lt;span class=&quot;token&quot;&gt;&amp;gt;&lt;/span&gt;&lt;span class=&quot;token&quot;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;token&quot;&gt;	&lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #d73a49;&quot;&gt;@foreach&lt;/span&gt;&lt;span class=&quot;token&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #24292e;&quot;&gt;$&lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #24292e;&quot;&gt;list&lt;/span&gt;&lt;span class=&quot;token&quot;&gt; &lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #d73a49;&quot;&gt;as&lt;/span&gt;&lt;span class=&quot;token&quot;&gt; &lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #24292e;&quot;&gt;$&lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #24292e;&quot;&gt;model&lt;/span&gt;&lt;span class=&quot;token&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token&quot;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;token&quot;&gt;    	&lt;/span&gt;&lt;span class=&quot;token&quot;&gt;&amp;lt;&lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #22863a;&quot;&gt;li&lt;/span&gt;&lt;span class=&quot;token&quot;&gt; &lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #6f42c1;&quot;&gt;wire:key&lt;/span&gt;&lt;span class=&quot;token&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #032f62;&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #005cc5;&quot;&gt;{{&lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #032f62;&quot;&gt; &lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #24292e;&quot;&gt;$&lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #24292e;&quot;&gt;model&lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #d73a49;&quot;&gt;-&amp;gt;&lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #24292e;&quot;&gt;id&lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #032f62;&quot;&gt; &lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #005cc5;&quot;&gt;}}&lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #032f62;&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span class=&quot;token&quot;&gt; &lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #6f42c1;&quot;&gt;wire:transition.duration.175ms&lt;/span&gt;&lt;span class=&quot;token&quot;&gt;&amp;gt;&lt;/span&gt;&lt;span class=&quot;token&quot;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;token&quot;&gt;        	&lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #005cc5;&quot;&gt;{{&lt;/span&gt;&lt;span class=&quot;token&quot;&gt; &lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #24292e;&quot;&gt;$&lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #24292e;&quot;&gt;model&lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #d73a49;&quot;&gt;-&amp;gt;&lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #24292e;&quot;&gt;name&lt;/span&gt;&lt;span class=&quot;token&quot;&gt; &lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #005cc5;&quot;&gt;}}&lt;/span&gt;&lt;span class=&quot;token&quot;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;token&quot;&gt;        &lt;/span&gt;&lt;span class=&quot;token&quot;&gt;&amp;lt;/&lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #22863a;&quot;&gt;li&lt;/span&gt;&lt;span class=&quot;token&quot;&gt;&amp;gt;&lt;/span&gt;&lt;span class=&quot;token&quot;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;token&quot;&gt;    &lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #d73a49;&quot;&gt;@endforeach&lt;/span&gt;&lt;span class=&quot;token&quot;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;token&quot;&gt;&amp;lt;/&lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #22863a;&quot;&gt;ul&lt;/span&gt;&lt;span class=&quot;token&quot;&gt;&amp;gt;&lt;/span&gt;&lt;span class=&quot;token&quot;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;Remove &lt;code&gt;wire:transition&lt;/code&gt; from the loop and add &lt;code&gt;x-auto-animate&lt;/code&gt; attribute to the parent.&lt;/p&gt;
&lt;div x-data=&quot;codeBlock&quot; class=&quot;code-block relative&quot;&gt;&lt;div class=&quot;flex space-x-2 items-center absolute top-0 right-0&quot;&gt;
    &lt;div x-cloak x-show=&quot;showMessage&quot; x-transition class=&quot;py-2 animate-bounce transition duration-300 mt-1 text-sky-500 text-xs&quot;&gt;Copied!&lt;/div&gt;
    &lt;button
        type=&quot;button&quot;
        title=&quot;Copy to clipboard&quot;
        class=&quot;hidden sm:block p-2 pl-3 transition duration-300&quot;
        @click.prevent=&quot;copyToClipboard&quot;
        :class=&quot;{
            'text-black/30 hover:text-black/80': !showMessage,
            'text-sky-500 hover:text-sky-700': showMessage,
        }&quot;&gt;
        &lt;svg xmlns=&quot;http://www.w3.org/2000/svg&quot; fill=&quot;none&quot; viewBox=&quot;0 0 24 24&quot; stroke-width=&quot;1.5&quot; stroke=&quot;currentColor&quot; class=&quot;block w-6 h-6&quot;&gt;
            &lt;path fill=&quot;white&quot; stroke-linecap=&quot;round&quot; stroke-linejoin=&quot;round&quot; d=&quot;M11.35 3.836c-.065.21-.1.433-.1.664 0 .414.336.75.75.75h4.5a.75.75 0 00.75-.75 2.25 2.25 0 00-.1-.664m-5.8 0A2.251 2.251 0 0113.5 2.25H15c1.012 0 1.867.668 2.15 1.586m-5.8 0c-.376.023-.75.05-1.124.08C9.095 4.01 8.25 4.973 8.25 6.108V8.25m8.9-4.414c.376.023.75.05 1.124.08 1.131.094 1.976 1.057 1.976 2.192V16.5A2.25 2.25 0 0118 18.75h-2.25m-7.5-10.5H4.875c-.621 0-1.125.504-1.125 1.125v11.25c0 .621.504 1.125 1.125 1.125h9.75c.621 0 1.125-.504 1.125-1.125V18.75m-7.5-10.5h6.375c.621 0 1.125.504 1.125 1.125v9.375m-8.25-3l1.5 1.5 3-3.75&quot; /&gt;
        &lt;/svg&gt;
    &lt;/button&gt;
&lt;/div&gt;&lt;pre class=&quot;phiki language-blade github-light&quot; data-language=&quot;blade&quot; style=&quot;background-color: #fff;color: #24292e;--phiki-line-highlight: #f6f8fa;&quot;&gt;&lt;code&gt;&lt;span class=&quot;line highlight&quot;&gt;&lt;span class=&quot;token&quot;&gt;&amp;lt;&lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #22863a;&quot;&gt;ul&lt;/span&gt;&lt;span class=&quot;token&quot;&gt; &lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #6f42c1;&quot;&gt;x-auto-animate.175ms&lt;/span&gt;&lt;span class=&quot;token&quot;&gt;&amp;gt;&lt;/span&gt;&lt;span class=&quot;token&quot;&gt; 
&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;token&quot;&gt;	&lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #d73a49;&quot;&gt;@foreach&lt;/span&gt;&lt;span class=&quot;token&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #24292e;&quot;&gt;$&lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #24292e;&quot;&gt;list&lt;/span&gt;&lt;span class=&quot;token&quot;&gt; &lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #d73a49;&quot;&gt;as&lt;/span&gt;&lt;span class=&quot;token&quot;&gt; &lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #24292e;&quot;&gt;$&lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #24292e;&quot;&gt;model&lt;/span&gt;&lt;span class=&quot;token&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token&quot;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;line highlight&quot;&gt;&lt;span class=&quot;token&quot;&gt;    	&lt;/span&gt;&lt;span class=&quot;token&quot;&gt;&amp;lt;&lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #22863a;&quot;&gt;li&lt;/span&gt;&lt;span class=&quot;token&quot;&gt; &lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #6f42c1;&quot;&gt;wire:key&lt;/span&gt;&lt;span class=&quot;token&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #032f62;&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #005cc5;&quot;&gt;{{&lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #032f62;&quot;&gt; &lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #24292e;&quot;&gt;$&lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #24292e;&quot;&gt;model&lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #d73a49;&quot;&gt;-&amp;gt;&lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #24292e;&quot;&gt;id&lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #032f62;&quot;&gt; &lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #005cc5;&quot;&gt;}}&lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #032f62;&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span class=&quot;token&quot;&gt;&amp;gt;&lt;/span&gt;&lt;span class=&quot;token&quot;&gt; 
&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;token&quot;&gt;        	&lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #005cc5;&quot;&gt;{{&lt;/span&gt;&lt;span class=&quot;token&quot;&gt; &lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #24292e;&quot;&gt;$&lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #24292e;&quot;&gt;model&lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #d73a49;&quot;&gt;-&amp;gt;&lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #24292e;&quot;&gt;name&lt;/span&gt;&lt;span class=&quot;token&quot;&gt; &lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #005cc5;&quot;&gt;}}&lt;/span&gt;&lt;span class=&quot;token&quot;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;token&quot;&gt;        &lt;/span&gt;&lt;span class=&quot;token&quot;&gt;&amp;lt;/&lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #22863a;&quot;&gt;li&lt;/span&gt;&lt;span class=&quot;token&quot;&gt;&amp;gt;&lt;/span&gt;&lt;span class=&quot;token&quot;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;token&quot;&gt;    &lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #d73a49;&quot;&gt;@endforeach&lt;/span&gt;&lt;span class=&quot;token&quot;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;token&quot;&gt;&amp;lt;/&lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #22863a;&quot;&gt;ul&lt;/span&gt;&lt;span class=&quot;token&quot;&gt;&amp;gt;&lt;/span&gt;&lt;span class=&quot;token&quot;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;Full documentation on how to cusotmize annimations &lt;a href=&quot;https://github.com/marcreichel/alpine-auto-animate&quot;&gt;on Github&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;And voilà!&lt;/p&gt;</summary>
        <content type="html">&lt;p&gt;If you have tried to use &lt;code&gt;wire:transition&lt;/code&gt; in a loop in Livewire, you may have seen some weird behaiour. It's because of &lt;a href=&quot;https://livewire.laravel.com/docs/wire-transition#limitations&quot;&gt;limitation&lt;/a&gt; recently documented on Livewire. But no worries, I have a workaround for you!&lt;/p&gt;
&lt;!--more--&gt;
&lt;p&gt;The solution is simple, we are gonna use &lt;a href=&quot;https://auto-animate.formkit.com&quot;&gt;AutoAnimate.js&lt;/a&gt; and to be more precise &lt;a href=&quot;https://github.com/marcreichel/alpine-auto-animate&quot;&gt;alpine-auto-animate&lt;/a&gt; wich is a Alpine.js wrapper.&lt;/p&gt;
&lt;ul class=&quot;table-of-contents not-prose&quot;&gt;
&lt;li&gt;&lt;a href=&quot;#content-installation&quot;&gt;Installation&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;#content-using-auto-animate-with-livewire&quot;&gt;Using auto animate with Livewire&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;&lt;a id=&quot;content-installation&quot; href=&quot;#content-installation&quot; class=&quot;heading-permalink&quot; aria-hidden=&quot;true&quot; tabindex=&quot;-1&quot; title=&quot;Permalink&quot;&gt;#&lt;/a&gt;Installation&lt;/h2&gt;
&lt;p&gt;The easiest way is to use the cdn to install the library&lt;/p&gt;
&lt;div x-data=&quot;codeBlock&quot; class=&quot;code-block relative&quot;&gt;&lt;div class=&quot;flex space-x-2 items-center absolute top-0 right-0&quot;&gt;
    &lt;div x-cloak x-show=&quot;showMessage&quot; x-transition class=&quot;py-2 animate-bounce transition duration-300 mt-1 text-sky-500 text-xs&quot;&gt;Copied!&lt;/div&gt;
    &lt;button
        type=&quot;button&quot;
        title=&quot;Copy to clipboard&quot;
        class=&quot;hidden sm:block p-2 pl-3 transition duration-300&quot;
        @click.prevent=&quot;copyToClipboard&quot;
        :class=&quot;{
            'text-black/30 hover:text-black/80': !showMessage,
            'text-sky-500 hover:text-sky-700': showMessage,
        }&quot;&gt;
        &lt;svg xmlns=&quot;http://www.w3.org/2000/svg&quot; fill=&quot;none&quot; viewBox=&quot;0 0 24 24&quot; stroke-width=&quot;1.5&quot; stroke=&quot;currentColor&quot; class=&quot;block w-6 h-6&quot;&gt;
            &lt;path fill=&quot;white&quot; stroke-linecap=&quot;round&quot; stroke-linejoin=&quot;round&quot; d=&quot;M11.35 3.836c-.065.21-.1.433-.1.664 0 .414.336.75.75.75h4.5a.75.75 0 00.75-.75 2.25 2.25 0 00-.1-.664m-5.8 0A2.251 2.251 0 0113.5 2.25H15c1.012 0 1.867.668 2.15 1.586m-5.8 0c-.376.023-.75.05-1.124.08C9.095 4.01 8.25 4.973 8.25 6.108V8.25m8.9-4.414c.376.023.75.05 1.124.08 1.131.094 1.976 1.057 1.976 2.192V16.5A2.25 2.25 0 0118 18.75h-2.25m-7.5-10.5H4.875c-.621 0-1.125.504-1.125 1.125v11.25c0 .621.504 1.125 1.125 1.125h9.75c.621 0 1.125-.504 1.125-1.125V18.75m-7.5-10.5h6.375c.621 0 1.125.504 1.125 1.125v9.375m-8.25-3l1.5 1.5 3-3.75&quot; /&gt;
        &lt;/svg&gt;
    &lt;/button&gt;
&lt;/div&gt;&lt;pre class=&quot;phiki language-html github-light&quot; data-language=&quot;html&quot; style=&quot;background-color: #fff;color: #24292e;&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;token&quot;&gt;&amp;lt;&lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #22863a;&quot;&gt;script&lt;/span&gt;&lt;span class=&quot;token&quot;&gt; &lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #6f42c1;&quot;&gt;src&lt;/span&gt;&lt;span class=&quot;token&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #032f62;&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #032f62;&quot;&gt;https://cdn.jsdelivr.net/npm/@marcreichel/alpine-auto-animate@latest/dist/alpine-auto-animate.min.js&lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #032f62;&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span class=&quot;token&quot;&gt; &lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #6f42c1;&quot;&gt;defer&lt;/span&gt;&lt;span class=&quot;token&quot;&gt;&amp;gt;&lt;/span&gt;&lt;span class=&quot;token&quot;&gt;&amp;lt;&lt;/span&gt;&lt;span class=&quot;token&quot;&gt;/&lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #22863a;&quot;&gt;script&lt;/span&gt;&lt;span class=&quot;token&quot;&gt;&amp;gt;&lt;/span&gt;&lt;span class=&quot;token&quot;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;But I didn't go the easy way, I prefer to package all in my own project. So we will have to follow Livewire documentation on &lt;a href=&quot;https://livewire.laravel.com/docs/installation#manually-bundling-livewire-and-alpine&quot;&gt;manually bundling Livewire and Alpine&lt;/a&gt;, then add alpine auto animate plugin.&lt;/p&gt;
&lt;p&gt;Your &lt;code&gt;app.js&lt;/code&gt; will now import Livewire and Alpine manually so you can add one or more plugins before Livewire start.&lt;/p&gt;
&lt;div x-data=&quot;codeBlock&quot; class=&quot;code-block relative&quot;&gt;&lt;div class=&quot;flex space-x-2 items-center absolute top-0 right-0&quot;&gt;
    &lt;div x-cloak x-show=&quot;showMessage&quot; x-transition class=&quot;py-2 animate-bounce transition duration-300 mt-1 text-sky-500 text-xs&quot;&gt;Copied!&lt;/div&gt;
    &lt;button
        type=&quot;button&quot;
        title=&quot;Copy to clipboard&quot;
        class=&quot;hidden sm:block p-2 pl-3 transition duration-300&quot;
        @click.prevent=&quot;copyToClipboard&quot;
        :class=&quot;{
            'text-black/30 hover:text-black/80': !showMessage,
            'text-sky-500 hover:text-sky-700': showMessage,
        }&quot;&gt;
        &lt;svg xmlns=&quot;http://www.w3.org/2000/svg&quot; fill=&quot;none&quot; viewBox=&quot;0 0 24 24&quot; stroke-width=&quot;1.5&quot; stroke=&quot;currentColor&quot; class=&quot;block w-6 h-6&quot;&gt;
            &lt;path fill=&quot;white&quot; stroke-linecap=&quot;round&quot; stroke-linejoin=&quot;round&quot; d=&quot;M11.35 3.836c-.065.21-.1.433-.1.664 0 .414.336.75.75.75h4.5a.75.75 0 00.75-.75 2.25 2.25 0 00-.1-.664m-5.8 0A2.251 2.251 0 0113.5 2.25H15c1.012 0 1.867.668 2.15 1.586m-5.8 0c-.376.023-.75.05-1.124.08C9.095 4.01 8.25 4.973 8.25 6.108V8.25m8.9-4.414c.376.023.75.05 1.124.08 1.131.094 1.976 1.057 1.976 2.192V16.5A2.25 2.25 0 0118 18.75h-2.25m-7.5-10.5H4.875c-.621 0-1.125.504-1.125 1.125v11.25c0 .621.504 1.125 1.125 1.125h9.75c.621 0 1.125-.504 1.125-1.125V18.75m-7.5-10.5h6.375c.621 0 1.125.504 1.125 1.125v9.375m-8.25-3l1.5 1.5 3-3.75&quot; /&gt;
        &lt;/svg&gt;
    &lt;/button&gt;
&lt;/div&gt;&lt;pre class=&quot;phiki language-javascript github-light&quot; data-language=&quot;javascript&quot; style=&quot;background-color: #fff;color: #24292e;&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;token&quot; style=&quot;color: #d73a49;&quot;&gt;import&lt;/span&gt;&lt;span class=&quot;token&quot;&gt; &lt;/span&gt;&lt;span class=&quot;token&quot;&gt;{&lt;/span&gt;&lt;span class=&quot;token&quot;&gt; &lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #24292e;&quot;&gt;Livewire&lt;/span&gt;&lt;span class=&quot;token&quot;&gt;,&lt;/span&gt;&lt;span class=&quot;token&quot;&gt; &lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #24292e;&quot;&gt;Alpine&lt;/span&gt;&lt;span class=&quot;token&quot;&gt; &lt;/span&gt;&lt;span class=&quot;token&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;token&quot;&gt; &lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #d73a49;&quot;&gt;from&lt;/span&gt;&lt;span class=&quot;token&quot;&gt; &lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #032f62;&quot;&gt;&amp;#039;&lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #032f62;&quot;&gt;../../vendor/livewire/livewire/dist/livewire.esm&lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #032f62;&quot;&gt;&amp;#039;&lt;/span&gt;&lt;span class=&quot;token&quot;&gt;;&lt;/span&gt;&lt;span class=&quot;token&quot;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;token&quot; style=&quot;color: #d73a49;&quot;&gt;import&lt;/span&gt;&lt;span class=&quot;token&quot;&gt; &lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #24292e;&quot;&gt;AutoAnimate&lt;/span&gt;&lt;span class=&quot;token&quot;&gt; &lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #d73a49;&quot;&gt;from&lt;/span&gt;&lt;span class=&quot;token&quot;&gt; &lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #032f62;&quot;&gt;&amp;#039;&lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #032f62;&quot;&gt;@marcreichel/alpine-auto-animate&lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #032f62;&quot;&gt;&amp;#039;&lt;/span&gt;&lt;span class=&quot;token&quot;&gt;;&lt;/span&gt;&lt;span class=&quot;token&quot;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;token&quot;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;token&quot; style=&quot;color: #24292e;&quot;&gt;Alpine&lt;/span&gt;&lt;span class=&quot;token&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #6f42c1;&quot;&gt;plugin&lt;/span&gt;&lt;span class=&quot;token&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #24292e;&quot;&gt;AutoAnimate&lt;/span&gt;&lt;span class=&quot;token&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token&quot;&gt;;&lt;/span&gt;&lt;span class=&quot;token&quot;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;token&quot;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;token&quot; style=&quot;color: #24292e;&quot;&gt;Livewire&lt;/span&gt;&lt;span class=&quot;token&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #6f42c1;&quot;&gt;start&lt;/span&gt;&lt;span class=&quot;token&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token&quot;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;And your blade layout should include two new blade tags&lt;/p&gt;
&lt;div x-data=&quot;codeBlock&quot; class=&quot;code-block relative&quot;&gt;&lt;div class=&quot;flex space-x-2 items-center absolute top-0 right-0&quot;&gt;
    &lt;div x-cloak x-show=&quot;showMessage&quot; x-transition class=&quot;py-2 animate-bounce transition duration-300 mt-1 text-sky-500 text-xs&quot;&gt;Copied!&lt;/div&gt;
    &lt;button
        type=&quot;button&quot;
        title=&quot;Copy to clipboard&quot;
        class=&quot;hidden sm:block p-2 pl-3 transition duration-300&quot;
        @click.prevent=&quot;copyToClipboard&quot;
        :class=&quot;{
            'text-black/30 hover:text-black/80': !showMessage,
            'text-sky-500 hover:text-sky-700': showMessage,
        }&quot;&gt;
        &lt;svg xmlns=&quot;http://www.w3.org/2000/svg&quot; fill=&quot;none&quot; viewBox=&quot;0 0 24 24&quot; stroke-width=&quot;1.5&quot; stroke=&quot;currentColor&quot; class=&quot;block w-6 h-6&quot;&gt;
            &lt;path fill=&quot;white&quot; stroke-linecap=&quot;round&quot; stroke-linejoin=&quot;round&quot; d=&quot;M11.35 3.836c-.065.21-.1.433-.1.664 0 .414.336.75.75.75h4.5a.75.75 0 00.75-.75 2.25 2.25 0 00-.1-.664m-5.8 0A2.251 2.251 0 0113.5 2.25H15c1.012 0 1.867.668 2.15 1.586m-5.8 0c-.376.023-.75.05-1.124.08C9.095 4.01 8.25 4.973 8.25 6.108V8.25m8.9-4.414c.376.023.75.05 1.124.08 1.131.094 1.976 1.057 1.976 2.192V16.5A2.25 2.25 0 0118 18.75h-2.25m-7.5-10.5H4.875c-.621 0-1.125.504-1.125 1.125v11.25c0 .621.504 1.125 1.125 1.125h9.75c.621 0 1.125-.504 1.125-1.125V18.75m-7.5-10.5h6.375c.621 0 1.125.504 1.125 1.125v9.375m-8.25-3l1.5 1.5 3-3.75&quot; /&gt;
        &lt;/svg&gt;
    &lt;/button&gt;
&lt;/div&gt;&lt;pre class=&quot;phiki language-blade github-light&quot; data-language=&quot;blade&quot; style=&quot;background-color: #fff;color: #24292e;--phiki-diff-insert-bg: #f0fff4;--phiki-diff-insert-fg: #22863a;&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;token&quot;&gt;&amp;lt;&lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #22863a;&quot;&gt;html&lt;/span&gt;&lt;span class=&quot;token&quot;&gt;&amp;gt;&lt;/span&gt;&lt;span class=&quot;token&quot;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;token&quot;&gt;&amp;lt;&lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #22863a;&quot;&gt;head&lt;/span&gt;&lt;span class=&quot;token&quot;&gt;&amp;gt;&lt;/span&gt;&lt;span class=&quot;token&quot;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;line insert&quot;&gt;&lt;span class=&quot;token&quot;&gt;    &lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #d73a49;&quot;&gt;@livewireStyles&lt;/span&gt;&lt;span class=&quot;token&quot;&gt; 
&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;token&quot;&gt;    &lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #d73a49;&quot;&gt;@vite&lt;/span&gt;&lt;span class=&quot;token&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #032f62;&quot;&gt;&amp;#039;&lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #032f62;&quot;&gt;resources/js/app.js&lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #032f62;&quot;&gt;&amp;#039;&lt;/span&gt;&lt;span class=&quot;token&quot;&gt;]&lt;/span&gt;&lt;span class=&quot;token&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token&quot;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;token&quot;&gt;&amp;lt;/&lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #22863a;&quot;&gt;head&lt;/span&gt;&lt;span class=&quot;token&quot;&gt;&amp;gt;&lt;/span&gt;&lt;span class=&quot;token&quot;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;token&quot;&gt;&amp;lt;&lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #22863a;&quot;&gt;body&lt;/span&gt;&lt;span class=&quot;token&quot;&gt;&amp;gt;&lt;/span&gt;&lt;span class=&quot;token&quot;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;token&quot;&gt;    &lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #005cc5;&quot;&gt;{{&lt;/span&gt;&lt;span class=&quot;token&quot;&gt; &lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #24292e;&quot;&gt;$&lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #24292e;&quot;&gt;slot&lt;/span&gt;&lt;span class=&quot;token&quot;&gt; &lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #005cc5;&quot;&gt;}}&lt;/span&gt;&lt;span class=&quot;token&quot;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;token&quot;&gt; 
&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;line insert&quot;&gt;&lt;span class=&quot;token&quot;&gt;    &lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #6f42c1;&quot;&gt;@livewireScriptConfig&lt;/span&gt;&lt;span class=&quot;token&quot;&gt; 
&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;token&quot;&gt;&amp;lt;/&lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #22863a;&quot;&gt;body&lt;/span&gt;&lt;span class=&quot;token&quot;&gt;&amp;gt;&lt;/span&gt;&lt;span class=&quot;token&quot;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;token&quot;&gt;&amp;lt;/&lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #22863a;&quot;&gt;html&lt;/span&gt;&lt;span class=&quot;token&quot;&gt;&amp;gt;&lt;/span&gt;&lt;span class=&quot;token&quot;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;h2&gt;&lt;a id=&quot;content-using-auto-animate-with-livewire&quot; href=&quot;#content-using-auto-animate-with-livewire&quot; class=&quot;heading-permalink&quot; aria-hidden=&quot;true&quot; tabindex=&quot;-1&quot; title=&quot;Permalink&quot;&gt;#&lt;/a&gt;Using auto animate with Livewire&lt;/h2&gt;
&lt;p&gt;So before, you probably tried something like that&lt;/p&gt;
&lt;div x-data=&quot;codeBlock&quot; class=&quot;code-block relative&quot;&gt;&lt;div class=&quot;flex space-x-2 items-center absolute top-0 right-0&quot;&gt;
    &lt;div x-cloak x-show=&quot;showMessage&quot; x-transition class=&quot;py-2 animate-bounce transition duration-300 mt-1 text-sky-500 text-xs&quot;&gt;Copied!&lt;/div&gt;
    &lt;button
        type=&quot;button&quot;
        title=&quot;Copy to clipboard&quot;
        class=&quot;hidden sm:block p-2 pl-3 transition duration-300&quot;
        @click.prevent=&quot;copyToClipboard&quot;
        :class=&quot;{
            'text-black/30 hover:text-black/80': !showMessage,
            'text-sky-500 hover:text-sky-700': showMessage,
        }&quot;&gt;
        &lt;svg xmlns=&quot;http://www.w3.org/2000/svg&quot; fill=&quot;none&quot; viewBox=&quot;0 0 24 24&quot; stroke-width=&quot;1.5&quot; stroke=&quot;currentColor&quot; class=&quot;block w-6 h-6&quot;&gt;
            &lt;path fill=&quot;white&quot; stroke-linecap=&quot;round&quot; stroke-linejoin=&quot;round&quot; d=&quot;M11.35 3.836c-.065.21-.1.433-.1.664 0 .414.336.75.75.75h4.5a.75.75 0 00.75-.75 2.25 2.25 0 00-.1-.664m-5.8 0A2.251 2.251 0 0113.5 2.25H15c1.012 0 1.867.668 2.15 1.586m-5.8 0c-.376.023-.75.05-1.124.08C9.095 4.01 8.25 4.973 8.25 6.108V8.25m8.9-4.414c.376.023.75.05 1.124.08 1.131.094 1.976 1.057 1.976 2.192V16.5A2.25 2.25 0 0118 18.75h-2.25m-7.5-10.5H4.875c-.621 0-1.125.504-1.125 1.125v11.25c0 .621.504 1.125 1.125 1.125h9.75c.621 0 1.125-.504 1.125-1.125V18.75m-7.5-10.5h6.375c.621 0 1.125.504 1.125 1.125v9.375m-8.25-3l1.5 1.5 3-3.75&quot; /&gt;
        &lt;/svg&gt;
    &lt;/button&gt;
&lt;/div&gt;&lt;pre class=&quot;phiki language-blade github-light&quot; data-language=&quot;blade&quot; style=&quot;background-color: #fff;color: #24292e;&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;token&quot;&gt;&amp;lt;&lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #22863a;&quot;&gt;ul&lt;/span&gt;&lt;span class=&quot;token&quot;&gt;&amp;gt;&lt;/span&gt;&lt;span class=&quot;token&quot;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;token&quot;&gt;	&lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #d73a49;&quot;&gt;@foreach&lt;/span&gt;&lt;span class=&quot;token&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #24292e;&quot;&gt;$&lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #24292e;&quot;&gt;list&lt;/span&gt;&lt;span class=&quot;token&quot;&gt; &lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #d73a49;&quot;&gt;as&lt;/span&gt;&lt;span class=&quot;token&quot;&gt; &lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #24292e;&quot;&gt;$&lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #24292e;&quot;&gt;model&lt;/span&gt;&lt;span class=&quot;token&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token&quot;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;token&quot;&gt;    	&lt;/span&gt;&lt;span class=&quot;token&quot;&gt;&amp;lt;&lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #22863a;&quot;&gt;li&lt;/span&gt;&lt;span class=&quot;token&quot;&gt; &lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #6f42c1;&quot;&gt;wire:key&lt;/span&gt;&lt;span class=&quot;token&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #032f62;&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #005cc5;&quot;&gt;{{&lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #032f62;&quot;&gt; &lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #24292e;&quot;&gt;$&lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #24292e;&quot;&gt;model&lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #d73a49;&quot;&gt;-&amp;gt;&lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #24292e;&quot;&gt;id&lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #032f62;&quot;&gt; &lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #005cc5;&quot;&gt;}}&lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #032f62;&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span class=&quot;token&quot;&gt; &lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #6f42c1;&quot;&gt;wire:transition.duration.175ms&lt;/span&gt;&lt;span class=&quot;token&quot;&gt;&amp;gt;&lt;/span&gt;&lt;span class=&quot;token&quot;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;token&quot;&gt;        	&lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #005cc5;&quot;&gt;{{&lt;/span&gt;&lt;span class=&quot;token&quot;&gt; &lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #24292e;&quot;&gt;$&lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #24292e;&quot;&gt;model&lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #d73a49;&quot;&gt;-&amp;gt;&lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #24292e;&quot;&gt;name&lt;/span&gt;&lt;span class=&quot;token&quot;&gt; &lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #005cc5;&quot;&gt;}}&lt;/span&gt;&lt;span class=&quot;token&quot;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;token&quot;&gt;        &lt;/span&gt;&lt;span class=&quot;token&quot;&gt;&amp;lt;/&lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #22863a;&quot;&gt;li&lt;/span&gt;&lt;span class=&quot;token&quot;&gt;&amp;gt;&lt;/span&gt;&lt;span class=&quot;token&quot;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;token&quot;&gt;    &lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #d73a49;&quot;&gt;@endforeach&lt;/span&gt;&lt;span class=&quot;token&quot;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;token&quot;&gt;&amp;lt;/&lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #22863a;&quot;&gt;ul&lt;/span&gt;&lt;span class=&quot;token&quot;&gt;&amp;gt;&lt;/span&gt;&lt;span class=&quot;token&quot;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;Remove &lt;code&gt;wire:transition&lt;/code&gt; from the loop and add &lt;code&gt;x-auto-animate&lt;/code&gt; attribute to the parent.&lt;/p&gt;
&lt;div x-data=&quot;codeBlock&quot; class=&quot;code-block relative&quot;&gt;&lt;div class=&quot;flex space-x-2 items-center absolute top-0 right-0&quot;&gt;
    &lt;div x-cloak x-show=&quot;showMessage&quot; x-transition class=&quot;py-2 animate-bounce transition duration-300 mt-1 text-sky-500 text-xs&quot;&gt;Copied!&lt;/div&gt;
    &lt;button
        type=&quot;button&quot;
        title=&quot;Copy to clipboard&quot;
        class=&quot;hidden sm:block p-2 pl-3 transition duration-300&quot;
        @click.prevent=&quot;copyToClipboard&quot;
        :class=&quot;{
            'text-black/30 hover:text-black/80': !showMessage,
            'text-sky-500 hover:text-sky-700': showMessage,
        }&quot;&gt;
        &lt;svg xmlns=&quot;http://www.w3.org/2000/svg&quot; fill=&quot;none&quot; viewBox=&quot;0 0 24 24&quot; stroke-width=&quot;1.5&quot; stroke=&quot;currentColor&quot; class=&quot;block w-6 h-6&quot;&gt;
            &lt;path fill=&quot;white&quot; stroke-linecap=&quot;round&quot; stroke-linejoin=&quot;round&quot; d=&quot;M11.35 3.836c-.065.21-.1.433-.1.664 0 .414.336.75.75.75h4.5a.75.75 0 00.75-.75 2.25 2.25 0 00-.1-.664m-5.8 0A2.251 2.251 0 0113.5 2.25H15c1.012 0 1.867.668 2.15 1.586m-5.8 0c-.376.023-.75.05-1.124.08C9.095 4.01 8.25 4.973 8.25 6.108V8.25m8.9-4.414c.376.023.75.05 1.124.08 1.131.094 1.976 1.057 1.976 2.192V16.5A2.25 2.25 0 0118 18.75h-2.25m-7.5-10.5H4.875c-.621 0-1.125.504-1.125 1.125v11.25c0 .621.504 1.125 1.125 1.125h9.75c.621 0 1.125-.504 1.125-1.125V18.75m-7.5-10.5h6.375c.621 0 1.125.504 1.125 1.125v9.375m-8.25-3l1.5 1.5 3-3.75&quot; /&gt;
        &lt;/svg&gt;
    &lt;/button&gt;
&lt;/div&gt;&lt;pre class=&quot;phiki language-blade github-light&quot; data-language=&quot;blade&quot; style=&quot;background-color: #fff;color: #24292e;--phiki-line-highlight: #f6f8fa;&quot;&gt;&lt;code&gt;&lt;span class=&quot;line highlight&quot;&gt;&lt;span class=&quot;token&quot;&gt;&amp;lt;&lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #22863a;&quot;&gt;ul&lt;/span&gt;&lt;span class=&quot;token&quot;&gt; &lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #6f42c1;&quot;&gt;x-auto-animate.175ms&lt;/span&gt;&lt;span class=&quot;token&quot;&gt;&amp;gt;&lt;/span&gt;&lt;span class=&quot;token&quot;&gt; 
&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;token&quot;&gt;	&lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #d73a49;&quot;&gt;@foreach&lt;/span&gt;&lt;span class=&quot;token&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #24292e;&quot;&gt;$&lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #24292e;&quot;&gt;list&lt;/span&gt;&lt;span class=&quot;token&quot;&gt; &lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #d73a49;&quot;&gt;as&lt;/span&gt;&lt;span class=&quot;token&quot;&gt; &lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #24292e;&quot;&gt;$&lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #24292e;&quot;&gt;model&lt;/span&gt;&lt;span class=&quot;token&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token&quot;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;line highlight&quot;&gt;&lt;span class=&quot;token&quot;&gt;    	&lt;/span&gt;&lt;span class=&quot;token&quot;&gt;&amp;lt;&lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #22863a;&quot;&gt;li&lt;/span&gt;&lt;span class=&quot;token&quot;&gt; &lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #6f42c1;&quot;&gt;wire:key&lt;/span&gt;&lt;span class=&quot;token&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #032f62;&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #005cc5;&quot;&gt;{{&lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #032f62;&quot;&gt; &lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #24292e;&quot;&gt;$&lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #24292e;&quot;&gt;model&lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #d73a49;&quot;&gt;-&amp;gt;&lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #24292e;&quot;&gt;id&lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #032f62;&quot;&gt; &lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #005cc5;&quot;&gt;}}&lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #032f62;&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span class=&quot;token&quot;&gt;&amp;gt;&lt;/span&gt;&lt;span class=&quot;token&quot;&gt; 
&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;token&quot;&gt;        	&lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #005cc5;&quot;&gt;{{&lt;/span&gt;&lt;span class=&quot;token&quot;&gt; &lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #24292e;&quot;&gt;$&lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #24292e;&quot;&gt;model&lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #d73a49;&quot;&gt;-&amp;gt;&lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #24292e;&quot;&gt;name&lt;/span&gt;&lt;span class=&quot;token&quot;&gt; &lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #005cc5;&quot;&gt;}}&lt;/span&gt;&lt;span class=&quot;token&quot;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;token&quot;&gt;        &lt;/span&gt;&lt;span class=&quot;token&quot;&gt;&amp;lt;/&lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #22863a;&quot;&gt;li&lt;/span&gt;&lt;span class=&quot;token&quot;&gt;&amp;gt;&lt;/span&gt;&lt;span class=&quot;token&quot;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;token&quot;&gt;    &lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #d73a49;&quot;&gt;@endforeach&lt;/span&gt;&lt;span class=&quot;token&quot;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;token&quot;&gt;&amp;lt;/&lt;/span&gt;&lt;span class=&quot;token&quot; style=&quot;color: #22863a;&quot;&gt;ul&lt;/span&gt;&lt;span class=&quot;token&quot;&gt;&amp;gt;&lt;/span&gt;&lt;span class=&quot;token&quot;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;Full documentation on how to cusotmize annimations &lt;a href=&quot;https://github.com/marcreichel/alpine-auto-animate&quot;&gt;on Github&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;And voilà!&lt;/p&gt;</content>
        <author>
            <name>Eser DENIZ</name>
        </author>
    </entry>
</feed>
