<?xml version="1.0" encoding="UTF-8"?>
<?xml-stylesheet href="/vendor/feed/atom.xsl" type="text/xsl"?>
<feed xmlns="http://www.w3.org/2005/Atom" xml:lang="en">
                        <id>https://gummibeer.dev/journal.atom</id>
                                <link href="https://gummibeer.dev/journal.atom" rel="self"></link>
                                <title><![CDATA[Journal | Tom Herrmann]]></title>
                    
                                <subtitle>Feed of all posts and streams.</subtitle>
                                                    <updated>2026-09-10T00:00:00+00:00</updated>
                        <entry>
            <title><![CDATA[Logarithmic auto-scaling for Laravel Horizon]]></title>
            <link rel="alternate" href="https://gummibeer.dev/blog/2026/logarithmic-auto-scaling-laravel-horizon" />
            <id>https://gummibeer.dev/blog/2026/logarithmic-auto-scaling-laravel-horizon</id>
            <author>
                <name><![CDATA[Tom Herrmann]]></name>
                <email><![CDATA[dev@gummibeer.de]]></email>

            </author>
            <summary type="html">
                <![CDATA[Why I added a logarithmic queue-size strategy to Laravel Horizon after large scheduled spikes kept starving smaller realtime queues.]]>
            </summary>
                                    <category term="engineering" />
                        <updated>2026-09-10T00:00:00+00:00</updated>
        </entry>
            <entry>
            <title><![CDATA[Using AI to review our D&D sessions]]></title>
            <link rel="alternate" href="https://gummibeer.dev/blog/2026/ai-session-review-machine" />
            <id>https://gummibeer.dev/blog/2026/ai-session-review-machine</id>
            <author>
                <name><![CDATA[Tom Herrmann]]></name>
                <email><![CDATA[dev@gummibeer.de]]></email>

            </author>
            <summary type="html">
                <![CDATA[How I use session transcripts, multiple AI reviewers and Notion to turn our D&D sessions into concrete roleplay feedback and next-session coaching.]]>
            </summary>
                                    <category term="ttrpg" />
                        <updated>2026-09-08T00:00:00+00:00</updated>
        </entry>
            <entry>
            <title><![CDATA[Custom Email Validation in Laravel]]></title>
            <link rel="alternate" href="https://gummibeer.dev/blog/2026/laravel-custom-email-validation" />
            <id>https://gummibeer.dev/blog/2026/laravel-custom-email-validation</id>
            <author>
                <name><![CDATA[Tom Herrmann]]></name>
                <email><![CDATA[dev@gummibeer.de]]></email>

            </author>
            <summary type="html">
                <![CDATA[How I extended Laravel's email rule to accept custom validator classes — the story behind the PR, and how to use it in real projects.]]>
            </summary>
                                    <category term="engineering" />
                        <updated>2026-04-24T00:00:00+00:00</updated>
        </entry>
            <entry>
            <title><![CDATA[Geography in Laravel: retrieving geographical data]]></title>
            <link rel="alternate" href="https://gummibeer.dev/blog/2024/geography-in-laravel-part1" />
            <id>https://gummibeer.dev/blog/2024/geography-in-laravel-part1</id>
            <author>
                <name><![CDATA[Tom Herrmann]]></name>
                <email><![CDATA[dev@gummibeer.de]]></email>

            </author>
            <summary type="html">
                <![CDATA[How to retrieve an geographical data from OpenStreetMap and transform them into usable PHP objects.]]>
            </summary>
                                    <category term="engineering" />
                        <updated>2024-07-24T00:00:00+00:00</updated>
        </entry>
            <entry>
            <title><![CDATA[Working at Hospitable]]></title>
            <link rel="alternate" href="https://gummibeer.dev/blog/2024/working-at-hospitable" />
            <id>https://gummibeer.dev/blog/2024/working-at-hospitable</id>
            <author>
                <name><![CDATA[Tom Herrmann]]></name>
                <email><![CDATA[dev@gummibeer.de]]></email>

            </author>
            <summary type="html">
                <![CDATA[Answering some questions I got how it is to work at Hospitable and about our hiring process.]]>
            </summary>
                                    <category term="professional" />
                        <updated>2024-06-28T00:00:00+00:00</updated>
        </entry>
            <entry>
            <title><![CDATA[Lessons from Open Source Software]]></title>
            <link rel="alternate" href="https://gummibeer.dev/blog/2024/lessons-from-open-source-software" />
            <id>https://gummibeer.dev/blog/2024/lessons-from-open-source-software</id>
            <author>
                <name><![CDATA[Tom Herrmann]]></name>
                <email><![CDATA[dev@gummibeer.de]]></email>

            </author>
            <summary type="html">
                <![CDATA[This post is a response/reaction to "From Contributor to Maintainer: Lessons from Open Source Software" by Patrick Organ.]]>
            </summary>
                                    <category term="professional" />
                        <updated>2024-06-25T00:00:00+00:00</updated>
        </entry>
            <entry>
            <title><![CDATA[Dynamic Route Model Binding in Laravel Eloquent]]></title>
            <link rel="alternate" href="https://gummibeer.dev/blog/2023/dynamic-route-model-binding" />
            <id>https://gummibeer.dev/blog/2023/dynamic-route-model-binding</id>
            <author>
                <name><![CDATA[Tom Herrmann]]></name>
                <email><![CDATA[dev@gummibeer.de]]></email>

            </author>
            <summary type="html">
                <![CDATA[Explore elegant solutions for resolving model binding, whether through named scopes for simplicity or custom query builders for precision.]]>
            </summary>
                                    <category term="engineering" />
                        <updated>2023-08-30T00:00:00+00:00</updated>
        </entry>
            <entry>
            <title><![CDATA[Immutable Carbon in Laravel]]></title>
            <link rel="alternate" href="https://gummibeer.dev/blog/2023/carbon-techniques-in-laravel" />
            <id>https://gummibeer.dev/blog/2023/carbon-techniques-in-laravel</id>
            <author>
                <name><![CDATA[Tom Herrmann]]></name>
                <email><![CDATA[dev@gummibeer.de]]></email>

            </author>
            <summary type="html">
                <![CDATA[A few Laravel-specific additions to my previous Carbon post: avoiding mutation, switching Laravel to CarbonImmutable globally, and immutable Eloquent casts.]]>
            </summary>
                                    <category term="engineering" />
                        <updated>2023-08-28T00:00:00+00:00</updated>
        </entry>
            <entry>
            <title><![CDATA[Using Discord roles for Laravel permissions]]></title>
            <link rel="alternate" href="https://gummibeer.dev/blog/2023/seamless-role-management-with-discord" />
            <id>https://gummibeer.dev/blog/2023/seamless-role-management-with-discord</id>
            <author>
                <name><![CDATA[Tom Herrmann]]></name>
                <email><![CDATA[dev@gummibeer.de]]></email>

            </author>
            <summary type="html">
                <![CDATA[How I made Discord the source of truth for our Laravel permissions instead of maintaining the same team roles twice.]]>
            </summary>
                                    <category term="engineering" />
                        <updated>2023-08-14T00:00:00+00:00</updated>
        </entry>
            <entry>
            <title><![CDATA[Preserving Date Integrity with Immutable Carbon]]></title>
            <link rel="alternate" href="https://gummibeer.dev/blog/2023/preserving-date-integrity" />
            <id>https://gummibeer.dev/blog/2023/preserving-date-integrity</id>
            <author>
                <name><![CDATA[Tom Herrmann]]></name>
                <email><![CDATA[dev@gummibeer.de]]></email>

            </author>
            <summary type="html">
                <![CDATA[Carbon is mutable by default, which means a harmless-looking date calculation can silently change the original value. This is why I prefer CarbonImmutable for dates I pass around application code.]]>
            </summary>
                                    <category term="engineering" />
                        <updated>2023-08-09T00:00:00+00:00</updated>
        </entry>
            <entry>
            <title><![CDATA[End of an era]]></title>
            <link rel="alternate" href="https://gummibeer.dev/blog/2022/end-of-an-era" />
            <id>https://gummibeer.dev/blog/2022/end-of-an-era</id>
            <author>
                <name><![CDATA[Tom Herrmann]]></name>
                <email><![CDATA[dev@gummibeer.de]]></email>

            </author>
            <summary type="html">
                <![CDATA[The last years were super disturbing and this is the end of a long episode of my life.]]>
            </summary>
                                    <category term="personal" />
                        <updated>2022-01-13T00:00:00+00:00</updated>
        </entry>
            <entry>
            <title><![CDATA[Setting up Laravel project for Shopify App Development]]></title>
            <link rel="alternate" href="https://youtu.be/lfbcIXXsmtA" />
            <id>https://youtu.be/lfbcIXXsmtA</id>
            <author>
                <name><![CDATA[Tom Herrmann]]></name>
                <email><![CDATA[dev@gummibeer.de]]></email>

            </author>
            <summary type="html">
                <![CDATA[Setting up Laravel project for Shopify App Development]]>
            </summary>
                                    <category term="stream" />
                        <updated>2021-08-26T00:00:00+00:00</updated>
        </entry>
            <entry>
            <title><![CDATA[Pest in Practice | Episode 4]]></title>
            <link rel="alternate" href="https://youtu.be/yvcYWo4Bi6U" />
            <id>https://youtu.be/yvcYWo4Bi6U</id>
            <author>
                <name><![CDATA[Tom Herrmann]]></name>
                <email><![CDATA[dev@gummibeer.de]]></email>

            </author>
            <summary type="html">
                <![CDATA[Pest in Practice | Episode 4]]>
            </summary>
                                    <category term="stream" />
                        <updated>2021-08-04T00:00:00+00:00</updated>
        </entry>
            <entry>
            <title><![CDATA[Pest in Practice | Episode 2]]></title>
            <link rel="alternate" href="https://youtu.be/T5Mbr1WPa1w" />
            <id>https://youtu.be/T5Mbr1WPa1w</id>
            <author>
                <name><![CDATA[Tom Herrmann]]></name>
                <email><![CDATA[dev@gummibeer.de]]></email>

            </author>
            <summary type="html">
                <![CDATA[Pest in Practice | Episode 2]]>
            </summary>
                                    <category term="stream" />
                        <updated>2021-07-21T00:00:00+00:00</updated>
        </entry>
            <entry>
            <title><![CDATA[Lets build a CRM/ERP system in Laravel - Episode 1]]></title>
            <link rel="alternate" href="https://youtu.be/N-3febTppLs" />
            <id>https://youtu.be/N-3febTppLs</id>
            <author>
                <name><![CDATA[Tom Herrmann]]></name>
                <email><![CDATA[dev@gummibeer.de]]></email>

            </author>
            <summary type="html">
                <![CDATA[Lets build a CRM/ERP system in Laravel - Episode 1]]>
            </summary>
                                    <category term="stream" />
                        <updated>2021-07-13T00:00:00+00:00</updated>
        </entry>
            <entry>
            <title><![CDATA[Pest in Practice | Episode 1]]></title>
            <link rel="alternate" href="https://youtu.be/UW9c6Q782l8" />
            <id>https://youtu.be/UW9c6Q782l8</id>
            <author>
                <name><![CDATA[Tom Herrmann]]></name>
                <email><![CDATA[dev@gummibeer.de]]></email>

            </author>
            <summary type="html">
                <![CDATA[Pest in Practice | Episode 1]]>
            </summary>
                                    <category term="stream" />
                        <updated>2021-07-08T00:00:00+00:00</updated>
        </entry>
            <entry>
            <title><![CDATA[Laravel Worldwide Meetup #9: Exploring Tailwind's Headless UI / opendor.me behind the scenes]]></title>
            <link rel="alternate" href="https://youtu.be/bcnR4NYOw2o" />
            <id>https://youtu.be/bcnR4NYOw2o</id>
            <author>
                <name><![CDATA[Tom Herrmann]]></name>
                <email><![CDATA[dev@gummibeer.de]]></email>

            </author>
            <summary type="html">
                <![CDATA[Laravel Worldwide Meetup #9: Exploring Tailwind's Headless UI / opendor.me behind the scenes]]>
            </summary>
                                    <category term="stream" />
                        <updated>2021-05-25T00:00:00+00:00</updated>
        </entry>
            <entry>
            <title><![CDATA[Let's play with Laravel LiveWire]]></title>
            <link rel="alternate" href="https://youtu.be/cQT37gxGr6g" />
            <id>https://youtu.be/cQT37gxGr6g</id>
            <author>
                <name><![CDATA[Tom Herrmann]]></name>
                <email><![CDATA[dev@gummibeer.de]]></email>

            </author>
            <summary type="html">
                <![CDATA[Let's play with Laravel LiveWire]]>
            </summary>
                                    <category term="stream" />
                        <updated>2021-05-20T00:00:00+00:00</updated>
        </entry>
            <entry>
            <title><![CDATA[Laravel DACH Meetup: Mai 2021]]></title>
            <link rel="alternate" href="https://youtu.be/aYWDHv6nFuQ" />
            <id>https://youtu.be/aYWDHv6nFuQ</id>
            <author>
                <name><![CDATA[Tom Herrmann]]></name>
                <email><![CDATA[dev@gummibeer.de]]></email>

            </author>
            <summary type="html">
                <![CDATA[Laravel DACH Meetup: Mai 2021]]>
            </summary>
                                    <category term="stream" />
                        <updated>2021-05-03T00:00:00+00:00</updated>
        </entry>
            <entry>
            <title><![CDATA[Laravel Queue Job refactoring to Batch]]></title>
            <link rel="alternate" href="https://youtu.be/M39PmuMgj44" />
            <id>https://youtu.be/M39PmuMgj44</id>
            <author>
                <name><![CDATA[Tom Herrmann]]></name>
                <email><![CDATA[dev@gummibeer.de]]></email>

            </author>
            <summary type="html">
                <![CDATA[Laravel Queue Job refactoring to Batch]]>
            </summary>
                                    <category term="stream" />
                        <updated>2021-04-18T00:00:00+00:00</updated>
        </entry>
            <entry>
            <title><![CDATA[opendor.me release announcement]]></title>
            <link rel="alternate" href="https://youtu.be/Di3QSWU0jpE" />
            <id>https://youtu.be/Di3QSWU0jpE</id>
            <author>
                <name><![CDATA[Tom Herrmann]]></name>
                <email><![CDATA[dev@gummibeer.de]]></email>

            </author>
            <summary type="html">
                <![CDATA[opendor.me release announcement]]>
            </summary>
                                    <category term="stream" />
                        <updated>2021-04-15T00:00:00+00:00</updated>
        </entry>
            <entry>
            <title><![CDATA[Building a Laravel Blade package #3]]></title>
            <link rel="alternate" href="https://youtu.be/Z4pa2m9XnSw" />
            <id>https://youtu.be/Z4pa2m9XnSw</id>
            <author>
                <name><![CDATA[Tom Herrmann]]></name>
                <email><![CDATA[dev@gummibeer.de]]></email>

            </author>
            <summary type="html">
                <![CDATA[Building a Laravel Blade package #3]]>
            </summary>
                                    <category term="stream" />
                        <updated>2021-03-26T00:00:00+00:00</updated>
        </entry>
            <entry>
            <title><![CDATA[Building a Laravel Blade package #2 - Larabelles]]></title>
            <link rel="alternate" href="https://youtu.be/eZBIv5wVa3k" />
            <id>https://youtu.be/eZBIv5wVa3k</id>
            <author>
                <name><![CDATA[Tom Herrmann]]></name>
                <email><![CDATA[dev@gummibeer.de]]></email>

            </author>
            <summary type="html">
                <![CDATA[Building a Laravel Blade package #2 - Larabelles]]>
            </summary>
                                    <category term="stream" />
                        <updated>2021-03-19T00:00:00+00:00</updated>
        </entry>
            <entry>
            <title><![CDATA[Building a Laravel Blade package #1 -  Larabelles]]></title>
            <link rel="alternate" href="https://youtu.be/LZqFusvlmew" />
            <id>https://youtu.be/LZqFusvlmew</id>
            <author>
                <name><![CDATA[Tom Herrmann]]></name>
                <email><![CDATA[dev@gummibeer.de]]></email>

            </author>
            <summary type="html">
                <![CDATA[Building a Laravel Blade package #1 -  Larabelles]]>
            </summary>
                                    <category term="stream" />
                        <updated>2021-03-12T00:00:00+00:00</updated>
        </entry>
            <entry>
            <title><![CDATA[Yoda 🌹🕯️]]></title>
            <link rel="alternate" href="https://gummibeer.dev/blog/2021/yoda" />
            <id>https://gummibeer.dev/blog/2021/yoda</id>
            <author>
                <name><![CDATA[Tom Herrmann]]></name>
                <email><![CDATA[dev@gummibeer.de]]></email>

            </author>
            <summary type="html">
                <![CDATA[Warning: This post is sad and contains potentially disturbing content.]]>
            </summary>
                                    <category term="personal" />
                        <updated>2021-01-28T00:00:00+00:00</updated>
        </entry>
            <entry>
            <title><![CDATA[Font optimization with Glyphhanger]]></title>
            <link rel="alternate" href="https://gummibeer.dev/blog/2021/font-optimization-with-glyphhanger" />
            <id>https://gummibeer.dev/blog/2021/font-optimization-with-glyphhanger</id>
            <author>
                <name><![CDATA[Tom Herrmann]]></name>
                <email><![CDATA[dev@gummibeer.de]]></email>

            </author>
            <summary type="html">
                <![CDATA[A guide on how to optimize webfonts with Glyphhanger by subsetting.]]>
            </summary>
                                    <category term="engineering" />
                        <updated>2021-01-20T00:00:00+00:00</updated>
        </entry>
            <entry>
            <title><![CDATA[Static search with Fuse.js]]></title>
            <link rel="alternate" href="https://gummibeer.dev/blog/2021/static-search-with-fusejs" />
            <id>https://gummibeer.dev/blog/2021/static-search-with-fusejs</id>
            <author>
                <name><![CDATA[Tom Herrmann]]></name>
                <email><![CDATA[dev@gummibeer.de]]></email>

            </author>
            <summary type="html">
                <![CDATA[A guide for a JAMstack compatible static search with Fuse.js]]>
            </summary>
                                    <category term="engineering" />
                        <updated>2021-01-09T00:00:00+00:00</updated>
        </entry>
            <entry>
            <title><![CDATA[A recap of 2020]]></title>
            <link rel="alternate" href="https://gummibeer.dev/blog/2021/a-recap-of-2020" />
            <id>https://gummibeer.dev/blog/2021/a-recap-of-2020</id>
            <author>
                <name><![CDATA[Tom Herrmann]]></name>
                <email><![CDATA[dev@gummibeer.de]]></email>

            </author>
            <summary type="html">
                <![CDATA[My recap of the possibly worst year - 2020.]]>
            </summary>
                                    <category term="personal" />
                        <updated>2021-01-05T00:00:00+00:00</updated>
        </entry>
            <entry>
            <title><![CDATA[PHP-Doc in Blade-Views]]></title>
            <link rel="alternate" href="https://gummibeer.dev/blog/2020/phpdoc-in-blade-views" />
            <id>https://gummibeer.dev/blog/2020/phpdoc-in-blade-views</id>
            <author>
                <name><![CDATA[Tom Herrmann]]></name>
                <email><![CDATA[dev@gummibeer.de]]></email>

            </author>
            <summary type="html">
                <![CDATA[How to use PHP-doc tags for better autocompletion in Blade views.]]>
            </summary>
                                    <category term="engineering" />
                        <updated>2020-12-19T00:00:00+00:00</updated>
        </entry>
            <entry>
            <title><![CDATA[Blade-Component: Webmentions]]></title>
            <link rel="alternate" href="https://gummibeer.dev/blog/2020/blade-component-webmentions" />
            <id>https://gummibeer.dev/blog/2020/blade-component-webmentions</id>
            <author>
                <name><![CDATA[Tom Herrmann]]></name>
                <email><![CDATA[dev@gummibeer.de]]></email>

            </author>
            <summary type="html">
                <![CDATA[A simple Blade component to get all your webmentions.]]>
            </summary>
                                    <category term="engineering" />
                        <updated>2020-12-17T00:00:00+00:00</updated>
        </entry>
            <entry>
            <title><![CDATA[Telegram Newsletter Command]]></title>
            <link rel="alternate" href="https://gummibeer.dev/blog/2020/telegram-newsletter-command" />
            <id>https://gummibeer.dev/blog/2020/telegram-newsletter-command</id>
            <author>
                <name><![CDATA[Tom Herrmann]]></name>
                <email><![CDATA[dev@gummibeer.de]]></email>

            </author>
            <summary type="html">
                <![CDATA[A basic Laravel console command to promote a blog post via Telegram.]]>
            </summary>
                                    <category term="engineering" />
                        <updated>2020-12-13T00:00:00+00:00</updated>
        </entry>
            <entry>
            <title><![CDATA[Human readable Intervals]]></title>
            <link rel="alternate" href="https://gummibeer.dev/blog/2020/human-readable-intervals" />
            <id>https://gummibeer.dev/blog/2020/human-readable-intervals</id>
            <author>
                <name><![CDATA[Tom Herrmann]]></name>
                <email><![CDATA[dev@gummibeer.de]]></email>

            </author>
            <summary type="html">
                <![CDATA[I will show you an easy way to write human readable intervals in your Laravel config and everywhere else.]]>
            </summary>
                                    <category term="engineering" />
                        <updated>2020-12-10T00:00:00+00:00</updated>
        </entry>
            <entry>
            <title><![CDATA[Hello World]]></title>
            <link rel="alternate" href="https://gummibeer.dev/blog/2020/hello-world" />
            <id>https://gummibeer.dev/blog/2020/hello-world</id>
            <author>
                <name><![CDATA[Tom Herrmann]]></name>
                <email><![CDATA[dev@gummibeer.de]]></email>

            </author>
            <summary type="html">
                <![CDATA[That's the first post on my new blog.]]>
            </summary>
                                    <category term="personal" />
                        <updated>2020-01-01T00:00:00+00:00</updated>
        </entry>
    </feed>
