<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom"><channel><title>👋 Hi. on Christoph Voigt 🚀</title><link>https://christophvoigt.com/</link><description>Recent content in 👋 Hi. on Christoph Voigt 🚀</description><generator>Hugo -- gohugo.io</generator><language>en</language><lastBuildDate>Thu, 19 Feb 2026 20:47:06 +0100</lastBuildDate><atom:link href="https://christophvoigt.com/rss.xml" rel="self" type="application/rss+xml"/><item><title>Screen Manager</title><link>https://christophvoigt.com/notes/firefly-devlog/09-screen-manager/</link><pubDate>Sun, 22 Feb 2026 00:00:00 +0000</pubDate><guid>https://christophvoigt.com/notes/firefly-devlog/09-screen-manager/</guid><description>&lt;p&gt;I needed a more robust way to switch Screens. At this point in time I have three different screens:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Start Screen&lt;/li&gt;
&lt;li&gt;Game Screen&lt;/li&gt;
&lt;li&gt;Result Screen (shown when Game Over)&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Switching to those screens worked via a global variable. Game starts? &lt;code&gt;var screen string = &amp;quot;start&amp;quot;&lt;/code&gt;. Enter the game? &lt;code&gt;screen = &amp;quot;game&amp;quot;&lt;/code&gt;&amp;hellip; You get the idea.&lt;/p&gt;
&lt;p&gt;The problem with this approach: it is surprisingly hard to keep track about what screen is supposed to be shown. This gets messy pretty soon, especially when those screens are stateful.&lt;/p&gt;
&lt;p&gt;So I &amp;ldquo;invented&amp;rdquo; a ScreenManager logic, to register screens at startup and set the right screen when desired. This not only makes intent way more obvious, but it also allows for some screen-lifecycle. I can now react &lt;code&gt;OnEnter()&lt;/code&gt; or &lt;code&gt;OnExit()&lt;/code&gt;, e.g. for loading/unloading assets. This structure would even be sufficient if I later want to implement a &amp;ldquo;back&amp;rdquo; functionality. If anyone is interested, I created a barebones PoC &lt;a href="https://tangled.org/voigt.tngl.sh/firefly-zero-playground/tree/main/screenmanager" target="_blank"&gt;here&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;Change: oozwpxwk&lt;/p&gt;
&lt;h3 class="relative group"&gt;Creating a Settings Screen
&lt;div id="creating-a-settings-screen" class="anchor"&gt;&lt;/div&gt;
&lt;span
class="absolute top-0 w-6 transition-opacity opacity-0 ltr:-left-6 rtl:-right-6 not-prose group-hover:opacity-100"&gt;
&lt;a class="group-hover:text-primary-300 dark:group-hover:text-neutral-700"
style="text-decoration-line: none !important;" href="#creating-a-settings-screen" aria-label="Anchor"&gt;#&lt;/a&gt;
&lt;/span&gt;
&lt;/h3&gt;
&lt;p&gt;Now that I have something to switch screens, I started working on a settings screen. This will be the screen to view or edit configurations.&lt;/p&gt;
&lt;video controls preload="auto" width="100%" autoplay loop playsinline class="html-video"&gt;
&lt;source src="https://christophvoigt.com/notes/firefly-devlog/09-screen-manager/assets/CleanShot%202026-02-23%20at%2017.25.36%201.mp4" type="video/mp4"&gt;
&lt;span&gt;Your browser doesn't support embedded videos, but don't worry, you can &lt;a href="https://christophvoigt.com/notes/firefly-devlog/09-screen-manager/assets/CleanShot%202026-02-23%20at%2017.25.36%201.mp4"&gt;download it&lt;/a&gt; and watch it with your favorite video player!&lt;/span&gt;
&lt;/video&gt;
&lt;p&gt;Not exceptionally beautiful or even exciting. But it works and does what it is supposed to do. Everything design related is anyways a task on its own, that I successfully procrastinate&amp;hellip;&lt;/p&gt;
&lt;p&gt;Change: lkmypylt&lt;/p&gt;</description></item><item><title>Apotris</title><link>https://christophvoigt.com/notes/firefly-devlog/08-apotris/</link><pubDate>Sat, 21 Feb 2026 00:00:00 +0000</pubDate><guid>https://christophvoigt.com/notes/firefly-devlog/08-apotris/</guid><description>&lt;p&gt;Today I learned about &lt;a href="https://akouzoukos.com/apotris" target="_blank"&gt;Apotris&lt;/a&gt;. My first impression? Fuck! Fuck is this good!&lt;/p&gt;
&lt;p&gt;When I started developing I didn&amp;rsquo;t have the ambition to create the best Tetris clone out there. But I was convinced I&amp;rsquo;d have a few novel ideas at least. Turns out my ideas aren&amp;rsquo;t as novel ;D&lt;/p&gt;
&lt;p&gt;Even the cooperative multiplayer is something thats already existing in Tetris Effect Connected, as I learned just recently (if you haven&amp;rsquo;t seen it, &lt;a href="https://youtu.be/WmW8V507nM8?si=qU2W6J2S_3DZhDg2&amp;amp;t=127" target="_blank"&gt;check it out&lt;/a&gt;!).&lt;/p&gt;
&lt;p&gt;To me this brings up a question: why implement a new Tetris clone, if there is already a very good, open source, freely available one that got ported to other platforms already? Why not port Apotris to Firefly-Zero instead?&lt;/p&gt;
&lt;p&gt;I haven’t looked deeply into the source code, so I don’t know whether it’s possible or how much effort it would take. Maybe someone will port it eventually.&lt;/p&gt;
&lt;p&gt;I, for one, am having a blast implementing Tetris. It has probably been done thousands of times, but I enjoy thinking through the problems, even if other people have already solved them. 😂&lt;/p&gt;</description></item><item><title>State Drift</title><link>https://christophvoigt.com/notes/firefly-devlog/06-state-drift/</link><pubDate>Mon, 16 Feb 2026 00:00:00 +0000</pubDate><guid>https://christophvoigt.com/notes/firefly-devlog/06-state-drift/</guid><description>&lt;p&gt;New entry for the devlog: We now have a proper distinction between singleplayer/multiplayer-coop. The later one is now also fully functional. For coop I implemented player-specific colors, so it is possible to see who dropped which blocks (will be configurable in future). Without it looked a bit &amp;ldquo;chaotic&amp;rdquo;. Also I think it will be cool to see &amp;ldquo;who is faster&amp;rdquo;. I also thought about making the block drop round based&amp;hellip; But I feel like this way its more fun.&lt;/p&gt;
&lt;video controls preload="auto" width="100%" autoplay loop playsinline class="html-video"&gt;
&lt;source src="https://christophvoigt.com/notes/firefly-devlog/06-state-drift/assets/CleanShot%20Feb%2016%202026.mp4" type="video/mp4"&gt;
&lt;span&gt;Your browser doesn't support embedded videos, but don't worry, you can &lt;a href="https://christophvoigt.com/notes/firefly-devlog/06-state-drift/assets/CleanShot%20Feb%2016%202026.mp4"&gt;download it&lt;/a&gt; and watch it with your favorite video player!&lt;/span&gt;
&lt;/video&gt;
&lt;p&gt;But oh no! The state drifts.&lt;/p&gt;
&lt;p&gt;
&lt;figure&gt;
&lt;img class="my-0 rounded-md" loading="lazy" alt="" src="./assets/Pasted%20image%2020260222215539.png" /&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p&gt;Gram told me I should be careful with &lt;code&gt;getMe()&lt;/code&gt; calls outside of &lt;code&gt;render()&lt;/code&gt;. Investigating&amp;hellip;&lt;/p&gt;
&lt;p&gt;References:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="https://discord.com/channels/1291387443089637426/1472908443139702945" target="_blank"&gt;Discord&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;</description></item><item><title>Cooperative Multiplayer PoC</title><link>https://christophvoigt.com/notes/firefly-devlog/05-cooperative-multiplayer-poc/</link><pubDate>Sat, 14 Feb 2026 00:00:00 +0000</pubDate><guid>https://christophvoigt.com/notes/firefly-devlog/05-cooperative-multiplayer-poc/</guid><description>&lt;p&gt;Started tackling (coop) multiplayer&amp;hellip; I broke quite a bit of my input logic (have yet to understand why), but overall it does what I expect !😄&lt;/p&gt;
&lt;video controls preload="auto" width="100%" autoplay loop playsinline class="html-video"&gt;
&lt;source src="https://christophvoigt.com/notes/firefly-devlog/05-cooperative-multiplayer-poc/assets/CleanShot%20Feb%2014%202026.mp4" type="video/mp4"&gt;
&lt;span&gt;Your browser doesn't support embedded videos, but don't worry, you can &lt;a href="https://christophvoigt.com/notes/firefly-devlog/05-cooperative-multiplayer-poc/assets/CleanShot%20Feb%2014%202026.mp4"&gt;download it&lt;/a&gt; and watch it with your favorite video player!&lt;/span&gt;
&lt;/video&gt;
&lt;p&gt;References:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="https://discord.com/channels/1291387443089637426/1291387543513727047/1472366767274983525" target="_blank"&gt;Discord&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;</description></item><item><title>Save Blocks</title><link>https://christophvoigt.com/notes/firefly-devlog/04-save-blocks/</link><pubDate>Fri, 13 Feb 2026 00:00:00 +0000</pubDate><guid>https://christophvoigt.com/notes/firefly-devlog/04-save-blocks/</guid><description>&lt;p&gt;After going through the topic of SRS I have to admit: it feels like a totally different game. It is incredible how much this rule set pays into the tetris experience!&lt;/p&gt;
&lt;p&gt;It definitely took a while to find a good way to implement it; but pretty happy with the outcome.&lt;/p&gt;
&lt;video controls preload="auto" width="100%" autoplay loop playsinline class="html-video"&gt;
&lt;source src="https://christophvoigt.com/notes/firefly-devlog/04-save-blocks/assets/CleanShot%20Feb%2013%202026.mp4" type="video/mp4"&gt;
&lt;span&gt;Your browser doesn't support embedded videos, but don't worry, you can &lt;a href="https://christophvoigt.com/notes/firefly-devlog/04-save-blocks/assets/CleanShot%20Feb%2013%202026.mp4"&gt;download it&lt;/a&gt; and watch it with your favorite video player!&lt;/span&gt;
&lt;/video&gt;
&lt;p&gt;Oh, and you can now save blocks for later 😎&lt;/p&gt;
&lt;p&gt;From a UI-perspective: do you prefer the save-block on the left or the right side?&lt;/p&gt;
&lt;p&gt;References:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="[Zulip]%28https://fireflyzero.zulipchat.com/#narrow/channel/569265-general/topic/Tetris-Clone.20WIP/near/573764461%29"&gt;Zulip&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;</description></item><item><title>SRS Shenanigans</title><link>https://christophvoigt.com/notes/firefly-devlog/03-srs-shenanigans/</link><pubDate>Thu, 12 Feb 2026 00:00:00 +0000</pubDate><guid>https://christophvoigt.com/notes/firefly-devlog/03-srs-shenanigans/</guid><description>&lt;p&gt;I was today years old when I learned, that my approach to dropping blocks is super naive. Hell, there is even an official Tetris guide on how blocks have to behave under certain conditions. They call it the &lt;a href="https://tetris.wiki/Super_Rotation_System" target="_blank"&gt;Super Rotation System&lt;/a&gt;!😅&lt;/p&gt;
&lt;p&gt;It even seems to be some kind of common sense among Tetris conoceurs.&lt;/p&gt;
&lt;p&gt;Guess I will implement it, as this would mean blocks in the game would behave as in every other modern Tetris game. Also things like T-Spins would be possible.&lt;/p&gt;
&lt;p&gt;References:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="https://discord.com/channels/1291387443089637426/1291387543513727047/1471409064469856368" target="_blank"&gt;Discord&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;</description></item><item><title>It's a game!</title><link>https://christophvoigt.com/notes/firefly-devlog/02-its-a-game/</link><pubDate>Tue, 10 Feb 2026 00:00:00 +0000</pubDate><guid>https://christophvoigt.com/notes/firefly-devlog/02-its-a-game/</guid><description>&lt;p&gt;Small update&amp;hellip; already way more playable. Scores, line count, levels work. hard drop and drop shadow caused some headache today, but running fine now. Next I&amp;rsquo;ll probably dig into UI. A lot of things can be configured already, would be cool to do this from UI instead of code !😎&lt;/p&gt;
&lt;video controls preload="auto" width="100%" autoplay loop playsinline class="html-video"&gt;
&lt;source src="https://christophvoigt.com/notes/firefly-devlog/02-its-a-game/assets/CleanShot%20Feb%2010%202026.mp4" type="video/mp4"&gt;
&lt;span&gt;Your browser doesn't support embedded videos, but don't worry, you can &lt;a href="https://christophvoigt.com/notes/firefly-devlog/02-its-a-game/assets/CleanShot%20Feb%2010%202026.mp4"&gt;download it&lt;/a&gt; and watch it with your favorite video player!&lt;/span&gt;
&lt;/video&gt;
&lt;p&gt;References:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="https://discord.com/channels/1291387443089637426/1291387543513727047/1470908824108929084" target="_blank"&gt;Discord&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;</description></item><item><title>Humble beginnings</title><link>https://christophvoigt.com/notes/firefly-devlog/01-humble-beginnings/</link><pubDate>Sun, 08 Feb 2026 00:00:00 +0000</pubDate><guid>https://christophvoigt.com/notes/firefly-devlog/01-humble-beginnings/</guid><description>&lt;p&gt;Over Christmas holidays I spend some time playing with the firefly-zero SDK. Over the weekend I took some free time to implement a Tetris clone. Parts of the game loop are already functional. My goal is to create a highly customisable version (configure block colors, enable games with/without save blocks, toggle next block preview, configurable number of rols/cols&amp;hellip;), to make a more interesting version of Tetris.&lt;/p&gt;
&lt;video controls preload="auto" width="100%" autoplay loop playsinline class="html-video"&gt;
&lt;source src="https://christophvoigt.com/notes/firefly-devlog/01-humble-beginnings/assets/CleanShot%20Feb%208%202026.mp4" type="video/mp4"&gt;
&lt;span&gt;Your browser doesn't support embedded videos, but don't worry, you can &lt;a href="https://christophvoigt.com/notes/firefly-devlog/01-humble-beginnings/assets/CleanShot%20Feb%208%202026.mp4"&gt;download it&lt;/a&gt; and watch it with your favorite video player!&lt;/span&gt;
&lt;/video&gt;
&lt;p&gt;Currently I&amp;rsquo;m struggling a bit finding a name&amp;hellip; As I wanted to adhere to the firefly theme, I came up with &amp;ldquo;Luminos&amp;rdquo; (&amp;hellip; Lumen, Tetriminos&amp;hellip; get it? 😅). The problem: apparently there is a board game with the same name. I still like it and use it as a working name&amp;hellip;&lt;/p&gt;
&lt;p&gt;Other names I came up with:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Lumen Blocks&lt;/li&gt;
&lt;li&gt;Firefly Blocks&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Some additional names the fine folks of the Firefly-Zero Discord came up with:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Fourfly&lt;/li&gt;
&lt;li&gt;Firetris&lt;/li&gt;
&lt;li&gt;Tetrafly&lt;/li&gt;
&lt;li&gt;Flytris&lt;/li&gt;
&lt;li&gt;Lucitris&lt;/li&gt;
&lt;li&gt;Lucid Blocks&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;References:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="https://discord.com/channels/1291387443089637426/1291387543513727047/1470162302413050109" target="_blank"&gt;Discord&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;</description></item><item><title>Trying smee</title><link>https://christophvoigt.com/notes/tryingsmee/</link><pubDate>Fri, 26 Sep 2025 00:00:00 +0000</pubDate><guid>https://christophvoigt.com/notes/tryingsmee/</guid><description>&lt;p&gt;I recently learned about &lt;code&gt;smee&lt;/code&gt;, which is a tool to forward webhooks (or any other kind of HTTP Post request) to a locally running service. This can come in particularly handy while developing a service locally, which isn’t exposed on your machine.&lt;/p&gt;
&lt;p&gt;The idea is simple:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;You create a channel on &lt;a href="https://smee.io" target="_blank"&gt;smee.io&lt;/a&gt;. This gives you a public endpoint that can receive HTTP POST requests.&lt;/li&gt;
&lt;li&gt;Smee.io emits incoming requests as &lt;strong&gt;Server-Sent Events (SSE)&lt;/strong&gt;.&lt;/li&gt;
&lt;li&gt;A local &lt;strong&gt;smee client&lt;/strong&gt; subscribes to these events and forwards them to your local service.&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;A simple walk through using a http-bin as locally running service which is not exposed to the internet:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;Install &lt;code&gt;smee-client&lt;/code&gt; on your local machine&lt;/li&gt;
&lt;/ol&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;$ npm install -g smee-client
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;ol start="2"&gt;
&lt;li&gt;Run &lt;code&gt;http-bin&lt;/code&gt; (or any other service)&lt;/li&gt;
&lt;/ol&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;$ docker run -p 3000:80 kennethreitz/httpbin
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;ol start="3"&gt;
&lt;li&gt;Run &lt;code&gt;smee-client&lt;/code&gt;&lt;/li&gt;
&lt;/ol&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;$ smee &lt;span class="se"&gt;\ &lt;/span&gt; &lt;span class="c1"&gt;# smee client&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; -t http://localhost:3000/post &lt;span class="c1"&gt;# locally running service&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;Forwarding https://smee.io/svEz8ll4Q0B8w36z to http://localhost:3000/post
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;Connected to https://smee.io/svEz8ll4Q0B8w36z
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;div
class="flex px-4 py-3 rounded-md bg-primary-100 dark:bg-primary-900"
&gt;
&lt;span
class="text-primary-400 ltr:pr-3 rtl:pl-3 flex items-center"
&gt;
&lt;span class="relative block icon"&gt;
&lt;svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 512 512"&gt;&lt;path fill="currentColor" d="M506.3 417l-213.3-364c-16.33-28-57.54-28-73.98 0l-213.2 364C-10.59 444.9 9.849 480 42.74 480h426.6C502.1 480 522.6 445 506.3 417zM232 168c0-13.25 10.75-24 24-24S280 154.8 280 168v128c0 13.25-10.75 24-23.1 24S232 309.3 232 296V168zM256 416c-17.36 0-31.44-14.08-31.44-31.44c0-17.36 14.07-31.44 31.44-31.44s31.44 14.08 31.44 31.44C287.4 401.9 273.4 416 256 416z"/&gt;&lt;/svg&gt;
&lt;/span&gt;
&lt;/span&gt;
&lt;span
class="dark:text-neutral-300"
&gt;&lt;p&gt;&lt;strong&gt;Note:&lt;/strong&gt; you can also manually register a new channel by going to &lt;a href="https://smee.io/" target="_blank"&gt;https://smee.io/&lt;/a&gt; and clicking &amp;ldquo;Register New Channel&amp;rdquo;. Which will&amp;hellip; create a new channel. You can use the endpoint of this channel by providing the &lt;code&gt;-u&lt;/code&gt; flag:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;$ smee &lt;span class="se"&gt;\ &lt;/span&gt; &lt;span class="c1"&gt;# smee client&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; -u https://smee.io/rCUe9fx5k03oryf7 &lt;span class="se"&gt;\ &lt;/span&gt;&lt;span class="c1"&gt;# enter smee URL&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; -t http://localhost:3000/post &lt;span class="c1"&gt;# locally running service&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;Forwarding https://smee.io/rCUe9fx5k03oryf7 to http://localhost:3000/post
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;Connected to https://smee.io/rCUe9fx5k03oryf7
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/span&gt;
&lt;/div&gt;
&lt;p&gt;If you now send your payload to the &lt;code&gt;smee&lt;/code&gt; endpoint, it will be forwarded to you locally running service:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;curl -XPOST &lt;span class="s1"&gt;&amp;#39;https://smee.io/rCUe9fx5k03oryf7&amp;#39;&lt;/span&gt; &lt;span class="se"&gt;\
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="se"&gt;&lt;/span&gt; -d &lt;span class="s1"&gt;&amp;#39;{&amp;#34;hello&amp;#34;:&amp;#34;world&amp;#34;}&amp;#39;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Your &lt;code&gt;smee&lt;/code&gt; client should confirm that with a 200 (or any other HTTP code your service yields).&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;Forwarding https://smee.io/rCUe9fx5k03oryf7 to http://localhost:3000/post
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;Connected to https://smee.io/rCUe9fx5k03oryf7
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;POST http://localhost:3000/post - &lt;span class="m"&gt;200&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Definitely a good tool to have as part of your tool box.&lt;/p&gt;</description></item><item><title>2025-09-18T00:00:00Z</title><link>https://christophvoigt.com/now/2025-09-18/</link><pubDate>Thu, 18 Sep 2025 00:00:00 +0000</pubDate><guid>https://christophvoigt.com/now/2025-09-18/</guid><description>&lt;p&gt;This is a &lt;a href="https://nownownow.com/about" target="_blank"&gt;now&lt;/a&gt; page. If you have a blog, &lt;a href="https://nownownow.com/about" target="_blank"&gt;you should make one&lt;/a&gt; too.&lt;/p&gt;
&lt;p&gt;It&amp;rsquo;s been a while that I wrote about things that are ongoing. Not because nothing is going on. Mainly because I&amp;rsquo;ve been busy with work and life. I&amp;rsquo;m married now. I bought a house. Busy times!&lt;/p&gt;
&lt;h2 class="relative group"&gt;House 🏡
&lt;div id="house-" class="anchor"&gt;&lt;/div&gt;
&lt;span
class="absolute top-0 w-6 transition-opacity opacity-0 ltr:-left-6 rtl:-right-6 not-prose group-hover:opacity-100"&gt;
&lt;a class="group-hover:text-primary-300 dark:group-hover:text-neutral-700"
style="text-decoration-line: none !important;" href="#house-" aria-label="Anchor"&gt;#&lt;/a&gt;
&lt;/span&gt;
&lt;/h2&gt;
&lt;p&gt;Last year, we moved into a house near Hanover, the place my wife and I have chosen as our home. While I&amp;rsquo;ve so far only experienced living in a flat I can say: it&amp;rsquo;s another quality of life. We are really happy with our decision.&lt;/p&gt;
&lt;h2 class="relative group"&gt;Joining the local fire brigade 🧑‍🚒
&lt;div id="joining-the-local-fire-brigade-" class="anchor"&gt;&lt;/div&gt;
&lt;span
class="absolute top-0 w-6 transition-opacity opacity-0 ltr:-left-6 rtl:-right-6 not-prose group-hover:opacity-100"&gt;
&lt;a class="group-hover:text-primary-300 dark:group-hover:text-neutral-700"
style="text-decoration-line: none !important;" href="#joining-the-local-fire-brigade-" aria-label="Anchor"&gt;#&lt;/a&gt;
&lt;/span&gt;
&lt;/h2&gt;
&lt;p&gt;In Germany, more than 95% of firefighters are &lt;a href="https://en.wikipedia.org/wiki/Volunteer_fire_department#Austria_and_Germany" target="_blank"&gt;volunteers&lt;/a&gt;. That’s something I neither knew nor cared about when I lived in a big city like Hannover. But your perspective changes once you own property and start wondering who would show up if things really went wrong. Therefore, I joined my local fire brigade and completed the &lt;a href="https://de.wikipedia.org/wiki/Feuerwehrausbildung#Lehrg%C3%A4nge" target="_blank"&gt;basic training&lt;/a&gt; needed to actually be of help. It’s been an exciting way to get involved as a volunteer: I like contributing to the local community, and I’ve come to really appreciate the camaraderie, which I honestly underestimated at first.&lt;/p&gt;
&lt;h2 class="relative group"&gt;Sports 🏃‍♂️
&lt;div id="sports-" class="anchor"&gt;&lt;/div&gt;
&lt;span
class="absolute top-0 w-6 transition-opacity opacity-0 ltr:-left-6 rtl:-right-6 not-prose group-hover:opacity-100"&gt;
&lt;a class="group-hover:text-primary-300 dark:group-hover:text-neutral-700"
style="text-decoration-line: none !important;" href="#sports-" aria-label="Anchor"&gt;#&lt;/a&gt;
&lt;/span&gt;
&lt;/h2&gt;
&lt;p&gt;After a nine-month break and a tough time getting back into it, I’ve finally managed to rebuild a bit of a running routine. The real challenge will be sticking with it through the winter. In past years, things like sickness, work stress, and bad (cold!) weather often made me stop. Let’s see how it goes this time!&lt;/p&gt;
&lt;h2 class="relative group"&gt;Work 👨🏼‍💻
&lt;div id="work-" class="anchor"&gt;&lt;/div&gt;
&lt;span
class="absolute top-0 w-6 transition-opacity opacity-0 ltr:-left-6 rtl:-right-6 not-prose group-hover:opacity-100"&gt;
&lt;a class="group-hover:text-primary-300 dark:group-hover:text-neutral-700"
style="text-decoration-line: none !important;" href="#work-" aria-label="Anchor"&gt;#&lt;/a&gt;
&lt;/span&gt;
&lt;/h2&gt;
&lt;p&gt;After more than six years I decided to quit Reply. While I definitely enjoyed the consulting business, I actually never wanted to stay there forever. I missed being part of an actual product. Create something and see it developing over years. As a consultant, you create a lot, but you rarely see things grow and mature, as project contracts are ultimately always finite. Which can be great, given the fact you have access to so many different organisations, teams, and system architectures. I will certainly miss a lot of aspects of working for Reply, but also I&amp;rsquo;m looking forward to my new challenges.&lt;/p&gt;
&lt;h2 class="relative group"&gt;Reading SciFi 📚
&lt;div id="reading-scifi-" class="anchor"&gt;&lt;/div&gt;
&lt;span
class="absolute top-0 w-6 transition-opacity opacity-0 ltr:-left-6 rtl:-right-6 not-prose group-hover:opacity-100"&gt;
&lt;a class="group-hover:text-primary-300 dark:group-hover:text-neutral-700"
style="text-decoration-line: none !important;" href="#reading-scifi-" aria-label="Anchor"&gt;#&lt;/a&gt;
&lt;/span&gt;
&lt;/h2&gt;
&lt;p&gt;I’ve recently started reading novels again. While I’ve always enjoyed books, most of my reading in recent years has been limited to work-related technical material. It feels great to read purely for pleasure. I recently finished “Project Hail Mary” by &lt;a href="https://en.wikipedia.org/wiki/Andy_Weir" target="_blank"&gt;Andy Weir&lt;/a&gt;, which I really enjoyed. Therefore I started another one of his books: “Artemis”.&lt;/p&gt;
&lt;h2 class="relative group"&gt;Playing &amp;ldquo;Elden Ring Nightreign&amp;rdquo; 🎮
&lt;div id="playing-elden-ring-nightreign-" class="anchor"&gt;&lt;/div&gt;
&lt;span
class="absolute top-0 w-6 transition-opacity opacity-0 ltr:-left-6 rtl:-right-6 not-prose group-hover:opacity-100"&gt;
&lt;a class="group-hover:text-primary-300 dark:group-hover:text-neutral-700"
style="text-decoration-line: none !important;" href="#playing-elden-ring-nightreign-" aria-label="Anchor"&gt;#&lt;/a&gt;
&lt;/span&gt;
&lt;/h2&gt;
&lt;p&gt;I’ve been excited about this game since its announcement and have been playing it ever since release. It’s a clever blend of &lt;a href="https://en.wikipedia.org/wiki/Soulslike" target="_blank"&gt;Soulslike&lt;/a&gt;, &lt;a href="https://en.wikipedia.org/wiki/Battle_royale_game" target="_blank"&gt;Battle Royale&lt;/a&gt;, and &lt;a href="https://en.wikipedia.org/wiki/Cooperative_video_game" target="_blank"&gt;Co-Op&lt;/a&gt; mechanics, which makes it both challenging and unique. The biggest hurdle is finding a capable group, as the entry level is quite high - new players struggle, even those coming from Elden Ring, since there are many new paths and boss patterns to learn. What I love most is the playtime: a single run takes about 40 minutes to an hour, which feels just right - enough for one satisfying session, but still leaving room for another if I want. Even though I’ve already finished every boss, I can easily see myself enjoying the game for a long time to come.&lt;/p&gt;</description></item></channel></rss>