yukiisbo.red

Drawing of my character by Luciel Teo

Yuki's Digest #1: Third time's the charm

Saturday, August 8, 2026

Table of Contents

I used to run a weekly newsletter in both university and school. It stopped at around 2023 because I wanted to recontemplate how I spend my time in life as I stopped needing to be in “survival mode”.

It’s been 3 years since and thankfully, I’m in a much better place now.

In the age of slop, Anything that’s made by humans by definition is valuable. Preserving authentic expression of the human condition is important.

Lets get started with the first public version.

Software Should Work

YouTube has been recommending me this conference called Software Should Work.

Honestly, I feel like I’ve been so jaded lately when it comes to computers, especially the “tech” scene. I wanted to do whatever I could to have anything but computers going on in my life as I don’t need it to survive anymore.

I relate a lot to Andrew Kelley’s “Don’t Take the Black Pill”.

Hypermedia Revolution

The rabbit hole that I found myself in however is datastar.

First, a bit of background from work

In the beginning, at work, we were a Django + Angular shop and I always loathe the REST/SPA approach.

Initially, I was just a backend developer: making the resources API necessary for the frontend developer to do their work. Everything was alright at first.

Then the app started to handle more data, it felt noticably sluggish. As most of the team in the project has departed, I found myself having to work on the frontend and well…

The reason why it’s slow is because it tried to JOIN data from different resources on the client so it had to do N+1 requests. Then on the mutation side, there’s a bunch of workarounds to achieve the feature where it needed to cross the resource boundary to achieve something.

So what could’ve been a dedicated API endpoint for both the query and mutation side ended up being a series of discrete requests.

When my job shifted to lead the development effort at work for all projects, my first focus was to eliminate this awful experience as it’s a pattern at the time.

After a rather bumpy road, we shifted completely to Laravel, PHP, and engineers doing the whole stack.

We always joked about how bad PHP was when we were a Python shop, but PHP 8 flipped that completely. Not to mention things in the ecosystem, like PHP-FIG.

The thing that sold us on Laravel were:

  • Inertia.js which eliminated the need for an API layer

    At the time, there wasn’t a good Inertia.js adapter for Django.

  • Laravel’s more integrated ecosystem of packages.

    Being reliant on so many third-party dependencies done by mostly strangers for “the usual” was a massive PITA.

    Our effort should be concentrated on what enables our customers, not window shopping for the best S3 adapter or background job dispatch/queueing.

Going back to Hypermedia

In the bumpy road, we explored a lot of ways of doing the frontend. Ultimately, the state lives in the backend, but a good user experience is also important.

Livewire, Blazor, Phoenix LiveView moved things too far away of the browser and we didn’t like that.

Turbo and htmx was closer, but it was too foreign and new for us. The idea of segmenting individual components into dedicated server-side pages was a bit out there at the time.

Ultimately, keeping it “traditional”, but React instead of Angular made sense. Being able to leverage React’s rich ecosystem was really valuable for us.

Personally, for CRUDs, I’m very happy with Inertia.js. It’s everything that I’ve ever wanted and it’s great fun.

But, these days, I feel like real-time is becoming the expected user experience. Polling works, but I always dreamed of being able to do real-time without it being difficult.

Laravel’s Broadcasting facilities are nice on paper, but in practice, the supporting components can be a massive pain. At least, [Reverb] improved the situation quite a bit.

At least with Inertia.js, we don’t have to revert to reconcile state mutations manually, but our fancy WebSocket infrastructure being a mere “hey, shit happened, reload your state now!” is rather sad.

The mentioned talk made me realize how much simpler and better SSEs are over WebSockets.

Plus, the approach of fat morphs and leveraging brotli compression felt the most natural with datastar.

I tried playing with the Laravel integration, but I realized quickly that Laravel doesn’t have an event system that crosses different PHP workers.

Laravel Octane/Swoole was hinted at me as a possible way of scaling large concurrent processes and it even have ways of crossing the boundary (which is pretty neat).

To illustrate, this isn’t possible:

class QuoteController extends Controller
{
    public function listen()
    {
        $quote = Cache::rememberForever("quote", Inspiring::quotes()->random);

        sse()->renderView("datastar.quote", [
            "quote" => $quote,
        ]);

        return sse()->getEventStream(function () {
            Event::listen(QuoteRandomized::class, function (
                QuoteRandomized $e,
            ) {
                sse()->renderView("datastar.quote", [
                    "quote" => $e->quote,
                ]);
            });
        });
    }

    public function random()
    {
        $quote = Inspiring::quotes()->random();
        Cache::set("quote", $quote);
        QuoteRandomized::dispatch($quote);
    }
}

For now, I’ll probably play with it using Deno as BroadcastChannel should make the above work.

If you know an example in Laravel (with source code), please let me know :)

If you’re looking for a component library that doesn’t rely on a specific framework, the following seems pretty decent:

The Backrooms

If you haven’t seen the Backrooms Movie, you really should. I’m not a fan of horror as don’t like jumpscares. Plus, I’ve watched way too many shitty horror films.

It’s refreshing seeing something new and unique for once rather than the same slop Hollywood is pushing out.

Little stroll around programming languages

It’s that time again where I just try different programming languages for no reason.

This time is because of this talk about Gleam by Giacomo Cavalieri.

I went through the Gleam tour and I discovered CodeCrafters which is an interactive programming challenge platform where you build your own version of Redis, Database, etc.

At the same time, I should mention “Build your own” series by James Smith.

Plus, there’s Crafting Interpreters by Bob Nystrom which I went through. I recommend it 10/10.

`(list processing)

Anyway, I tried Common Lisp, but I find Lisp-2 (where functions and values are in separate namespaces) to be awkward.

; Scheme (Lisp-1)
(let ((foo 'bar)
      (do-something (lambda () ...))
  ...)
; Common Lisp (Lisp-2)
(let ((foo 'bar))
  (labels ((do-something (lambda () ...))
    ...)

I moved to Clojure and at first, it’s going OK.

At some point, I find it hard to reason due to the lack of types and the thing which sent me to the wall is:

clojure-noob.core=> (doc reduce)
-------------------------
clojure.core/reduce
([f coll] [f val coll])

I’m used to partial application and Eta conversion in Haskell that this caught me off guard.

Lisp will always have a special place in my heart. Scheme and SICP was my foray into FP. But I’ve changed and became an ML/Haskeller.

That said, my short time has led me to the following resources:

Back to Haskell

I went back to Haskell and immediately felt like at home. Though, I don’t miss the long compile times.

I discovered Linear Types, which replicates the Rust borrow checker in Haskell. Serokell made a nice video introduction on it:

My problem with Haskell is its laziness nature in practice which leads to space leaks and performance problems that are hard to reason with.

I discovered Strict Haskell soon after which is pretty interesting. I think Make Invalid Laziness Unrepresentable is a good write-up on the topic.

Though, I was hinted at Idris as a strict alternative of Haskell with dependent types.

I think I’ll play around with Idris and see how it feels. I have heard about it and have heard about dependent types (mainly around Rocq though). Though, of course, unlike Haskell, there’s not a lot of industry use, it seems.

There’s also OCaml, but it feels lonely unless you’re Jane Street. I learned OCaml from Real World OCaml which warped my perspective of OCaml to around Jane Street’s ecosystem.

If you wanna pick up OCaml, I recommend the CS3110 course instead.

While you’re here, if you wanna learn Haskell, I always recommend Get Programming with Haskell by by Will Kurt.

Quake Heritage

Since the start of the year, I’ve been working on a Godot “game engine” which replicates the approach of Quake tradition. I called it “srcbase”.

What I meant by that is the designer focused way of creating levels with entities and triggers to create unique experiences.

I never liked the approach of today’s engine where you have to create levels with modular pieces and “objectize” interactions via prefabs and scripts.

I have tried getting something with Quake heritage working, but it’s just too much and unfun for me.

func_godot has matured quite a lot since Qodot and it pretty much enabled me to do what I want.

Thanks to StayAtHomeDev’s Godot FPS Tutorial Series for the initial foundation.

Let's Make An FPS in the Godot Engine
Welcome to the first episode of version 2.0 of my FPS tutorial series in the Godot Engine. Version 2 is bigger, better, and better organized. We will be creating a retro FPS game with modern twists in the Godot Engine from scratch. 🔥 Wishlist My FPS Game, Children of Kronos https://store.steampowered.com/app/3640450/Children_of_Kronos/?utm_source=youtube&utm_medium=description&utm_campaign=tutorial&utm_content=letsmakeanfpsinthegodotengine ----------------------------------------------------------------------------------- ✅ GET THE SOURCE FILES https://www.patreon.com/cw/StayAtHomeDev_ ✅ GET THE STARTERKIT PROJECT https://www.patreon.com/posts/make-fps-2-0-134340702 🏆 The FPS Tutorial Series 2.0 Roadmap https://www.stayathomedev.com/blog/fps-series-road-map 📝 There are also full code references at the end of the video! ----------------------------------------------------------------------------------- Episodes 002 - Camera Juice ►► https://youtu.be/53Awc2twnhA 003 - Stair Climbing ►► https://youtu.be/C5Je3eu5a2k 004 - Trenchbroom Setup ►► COMING SOON 005 - Swimming ►► COMING SOON ----------------------------------------------------------------------------------- This video covers the start of our FPS game featuring the following: - Prototype Level Setup - Filesystem Folder Organization - FPS Player Controller - Camera Controller - Mouse Capture Component - Functional State Machine - Walking - Sprinting - Idle - Crouch - Jump - Interaction Raycast Component - Main Scene Manager Setup - User Interface Setup with Dynamic Reticle - Debug Feature for State Machine and User-Defined Expressions ----------------------------------------------------------------------------------- CHAPTERS 00:00 Let's Made An FPS in Godot 00:19 Why Version 2.0? 00:49 Version 2.0 Will Be Bigger 01:03 Chapter 01: Project Setup 01:18 The Prototype Level 02:12 Chapter 2: Player Controller 03:09 Chapter 3: Camera Controller 04:03 Looking With the Mouse 04:56 Mouse Component Script 07:46 Using Our Mouse Capture Data 09:12 Why Mouse Vector is Swapped 10:04 Rotate the Player or the Camera? 10:49 Rotating the Camera 11:21 Rotating the Player 11:54 Chapter 4: Walking Movement 12:26 Input to Player Direction 12:56 Adding Gravity 13:35 Direction to Velocity 14:13 Normalize Your Direction Vector 14:32 Acceleration and Deceleration 15:14 Why We Separate the Y Velocity 16:28 Chapter 5: The State Machine 16:56 The Godot State Charts Addon 17:21 State Machine Node Structure 18:24 The Atomic State 19:01 Compound State's Default Atomic State 19:33 How To Move Between States 20:21 Using the Built-in State Signals 21:28 Parallel State Scripts Node 22:05 Building the Custom Script Solution 23:25 The Idle State 24:32 Update Player Controller References 25:33 Checking States With the Debug UI System 26:06 The Moving and Walking States 27:19 The Sprinting State 28:00 just_pressed vs pressed 28:46 Adjusting the Player's Speed with Modifiers 30:43 Chapter 6: The Crouching State 31:14 The Posture and Standing States 32:13 The Four Steps to Good Crouching 35:37 Fixing the Uncrouch Problem 37:03 Adding Your Own Debug Expressions With Godot State Charts 38:29 The Jumping State 40:57 Chapter 7: User Interface and Dynamic Crosshair 41:30 Creating the Main Scene 42:42 Designing the Dynamic Crosshair 45:18 Chapter 8: Interaction Raycast 47:03 Chapter 9: Quality of Life Code 47:58 Download the Project Files and Future Videos 49:27 Why I'm Doing a Version 2 50:57 We're Going Retro With Trenchbroom 52:08 Full Code References 52:12 Player Controller Script 52:22 Camera Controller Script 52:32 Mouse Capture Script | Interaction Raycast Script 52:42 State Machine Script | State Base Script 52:52 Idle / Walking / Sprinting / Moving 53:02 Grounded / Airborne / Standing / Crouching 53:12 Dynamic Reticle Script ----------------------------------------------------------------------------------- STAYATHOMEDEV ►► https://stayathomedev.com TWITTER ►► https://twitter.com/StayAtHomeDev BLUESKY ►► https://bsky.app/profile/stayathomedev.bsky.social MY ITCH.IO PAGE ►► https://stayathomedev.itch.io/ ----------------------------------------------------------------------------------- Resources: GODOT ENGINE ►► https://godotengine.org/ DOWNLOAD GODOT ►► https://godotengine.org/download #godot #godotengine #godot4
faviconwww.youtube.com
/rehype-og-card/ecae449bb40379f6b29cee9a79520374c46823525955bdc134309467c1b2706b.jpg

Also their video on setting up Trenchbroom + func_godot helped me wrapped my head around how it works.

Trenchbroom + Godot Engine Setup - Godot FPS Series #4
How to install and setup Trenchbroom level editor to work with the Godot Engine. Great way to make retro style FPS levels in Godot. ----------------------------------------------------------------------------------- ✅ GET THE SOURCE FILES https://www.patreon.com/cw/StayAtHomeDev_ ✅ GET THE STARTERKIT PROJECT https://www.patreon.com/posts/make-fps-2-0-134340702 🏆 The FPS Tutorial Series 2.0 Roadmap https://www.stayathomedev.com/blog/fps-series-road-map 🎮 Wishlist My FPS Game, Children of Kronos https://store.steampowered.com/app/3640450/Children_of_Kronos/?utm_source=youtube&utm_medium=description&utm_campaign=tutorial ----------------------------------------------------------------------------------- CHAPTERS 00:00 Start 00:05 Installing Trenchbroom 00:45 Installing the Godot Addon 01:42 Setting Up Folders for Trenchbroom 02:57 Creating Local Config Resource 04:37 Creating Game Config Resource 05:15 FGD (Forge Game Data) 06:15 Custom FGD Resource 07:46 Creating a Test Map 10:14 Importing .map into Godot 10:56 Creating Map Settings Resource 12:10 Clip and Skip Textures 13:50 Get the FPS Development Kit ----------------------------------------------------------------------------------- STAYATHOMEDEV ►► https://stayathomedev.com TWITTER ►► https://twitter.com/StayAtHomeDev BLUESKY ►► https://bsky.app/profile/stayathomedev.bsky.social MY ITCH.IO PAGE ►► https://stayathomedev.itch.io/ ----------------------------------------------------------------------------------- Resources: GODOT ENGINE ►► https://godotengine.org/ DOWNLOAD GODOT ►► https://godotengine.org/download #godot #godotengine #trenchbroom
faviconwww.youtube.com
/rehype-og-card/57516f32dae23273d02ffc6289daf37b0eca695c25c63c893ca62f35a353e1c5.jpg
TrenchBroom Custom Entities in Godot | Solid, Point & Model Classes - Godot FPS Series #5
Want to add your Godot scripts, nodes, and scenes right into the Trenchbroom level editor? You can with FGD Entity Classes and this video will show you how. ----------------------------------------------------------------------------------- ✅ GET THE SOURCE FILES https://www.patreon.com/cw/StayAtHomeDev_ ✅ GET THE STARTERKIT PROJECT https://www.patreon.com/posts/make-fps-2-0-134340702 🏆 The FPS Tutorial Series 2.0 Roadmap https://www.stayathomedev.com/blog/fps-series-road-map 🎮 Wishlist My FPS Game, Children of Kronos https://store.steampowered.com/app/3640450/Children_of_Kronos/?utm_source=youtube&utm_medium=description&utm_campaign=tutorial ----------------------------------------------------------------------------------- CHAPTERS 00:00 Trenchbroom Entity Classes and Godot 00:10 What You Need To Start 00:20 The SolidClass Entity 00:55 Moving Platform Script Overview 01:37 Import Properties to Script 02:15 The SolidClass Resource 04:20 Adding Class Properties 04:58 Connecting Class to Trenchbroom 05:25 Assigning Class to Brush 05:58 Godot Axis vs Trenchboom Axis 06:38 Importing Into Godot 08:14 The PointClass 09:26 Adding PointClass in Trenchbroom 09:53 The ModelPoint Class 12:30 How To Fix ModelPoint Textures 13:45 Get the FPS Development Kit ----------------------------------------------------------------------------------- STAYATHOMEDEV ►► https://stayathomedev.com TWITTER ►► https://twitter.com/StayAtHomeDev BLUESKY ►► https://bsky.app/profile/stayathomedev.bsky.social MY ITCH.IO PAGE ►► https://stayathomedev.itch.io/ ----------------------------------------------------------------------------------- Resources: GODOT ENGINE ►► https://godotengine.org/ DOWNLOAD GODOT ►► https://godotengine.org/download #godot #godotengine #trenchbroom
faviconwww.youtube.com
/rehype-og-card/c26f9cb5ae0be8a5dcd13f9430223316ea534c81b4613b8dc3404d72b338ee50.jpg

I was hoping to participate in Juniper Dev’s Serious Game Jam with my partner, but unfortunately, it was moving week for me and it was just too much.

We had a great concept that fits the theme though, sigh. At least, I spent the time needed to get the config pages done and dev console for manipulating Vars (CVar).

My only problem right now is lighting and the lack of BSP step.

There’s someone who made a plugin which allows you to edit lights in the Godot Editor and have it reflected back in the .map file, but that’s too destructive for me.

There’s also Quake BSP Importer for Godot, but it’s not to the level of func_godot yet.

In terms of game assets, I was recommended Pizza Doggy’s assets.

It works really well, but it looks too horror themed.

Then, I realized that I can just use WADs which unlocked using the assets from the Quake mapping community.

But I think everyone and their dog loves Makkon’s textures.

While you’re here, I recommend Slipseer’s videos on the more advanced Trenchbroom techniques.

Plus, dumptruck_ds’ excellent tutorials on Trenchbroom.

Quake Mapping: TrenchBroom 2 Quickstart
IMPORTANT: Trenchbroom has had some user interface changes since this video was published. Please refer to the use manual if you can't find something mentioned. Also the pinned comments have some specifics. If you want to make maps for Quake, Quake 2 or Hexen 2, TrenchBroom is your best option. If you’re a total newb or returning to mapping after a long time away this is the tutorial you’re looking for! Download TB right here: http://kristianduske.com/trenchbroom/ requires: https://www.microsoft.com/en-us/download/details.aspx?id=48145 PLEASE NOTE: TrenchBroom has an excellent manual. You can find it under the “Help” menu. TrenchBroom Discord: https://discord.com/invite/XaAuJVz Map-Center on Discord https://discord.gg/vSvqwys5hB UPDATE: Subscriber Jonathan Linat took the time to package all the required files (listed below) into a GitHub repo. This can be cloned to your own Git or downloaded. Thanks Jonathan! https://github.com/jonathanlinat/quake-leveldesign-starterkit If you don't want to use the link above, you’ll need the files available at the following sites: TrenchBroom 2 https://github.com/kduske/TrenchBroom/releases http://kristianduske.com/trenchbroom/ Start.wad https://www.quaddicted.com/files/wads/start.zip ericw-tools https://ericwa.github.io/ericw-tools/ requires: https://www.microsoft.com/en-ca/download/details.aspx?id=40784 Necros’ Compiling GUI 1.03 https://www.quaddicted.com/files/tools/ne_q1spCompilingGui103.zip https://shoresofnis.wordpress.com/utilities/ne_q1spcompilinggui/ Quakespasm https://quakespasm.sourceforge.net/download.htm https://sourceforge.net/projects/quakespasm/ Here’s a PDF with the setup information and keyboard shortcuts covered in the video. https://www.quaketastic.com/files/misc/dumptruck_ds_TrenchBroom_2_Tutorial_Setup_Shortcuts.pdf Here are timestamps to the tutorial highlights: 0:00 Start 0:21 Directory Setup 1:33 TrenchBroom Installation 1:43 Wad Installation 1:53 Tools Installation 2:13 Quakespasm Installation 2:27 TrenchBroom Preferences 2:59 New Map 3:21 Texture Collections 3:44 TrenchBroom Manual 4:06 Navigation Controls 5:13 Applying a Texture 5:18 Entity Inspectors 5:41 Move Entity Vertically 5:49 Grid Sizes 6:09 Reshaping Brushes 6:17 Copy Brushes 6:50 Duplicate in Place 6:57 Brush Movement 7:03 Rotate Brush 7:27 Brush Selection 7:51 Grid Size Shortcuts 9:09 Keyboard Copy Selected 9:51 Keyboard Rotate Selected 10:06 Point Light 10:36 Compiling Setup 12:09 Compile 12:20 Playtest
faviconwww.youtube.com
/rehype-og-card/aae5506e76712cd7b006fb2bbd05348b35637090cedf7e1749f3e40a29613853.jpg

On the topic of level design in general, the Level Design Book is a godsend.

My partner have gone through a game development program and recommended “An Architectural Approach to Level Design”.

Oh and also, Retro Modern Game Development with GZDoom by Neil McCallion is a nice talk.

Reflecting on isolation

Whenever I met someone one of the couple things they always ask is my handle on Instagram, Twitter, etc.

I always get a surprising reaction whenever I say that I don’t use social media and I’m not on any of those.

I don’t even remember when I quit social media altogether. These days, I don’t even participate in much online communities/discourse.

It does feel lonely from time to time, especially when friends are unreachable because life. At the same time, you start value the few people you have close to you.

I tried easing back via Final Fantasy XIV, Discord servers, and even open source.

But, ultimately, what I experienced is how dehumanizing the online experience is today. Relationships felt rather transactional/impersonal and if you don’t conform to whichever hole they want you to be in, the norm is to block or cancel.

At the end, I did manage to get a handful of people who I become close with personally to this day, but it was awful.

I miss friends whom I’ve lost contact with, but every time I think about being more active in online communities, I can’t shake what I’ve experienced.

I just wish people were kinder.

Releasing my pet projects publicly

Yesterday, I’ve decided to just publicly release all of the random small abandoned projects that were just sitting in my GitHub.

I think I should do this more often.

Ending

I’ve been considering about writing more regularly since I missed expressing myself publicly, even if it fall on deaf ears.

I don’t think I’ll be back on whatever Twitter clone du jour is. I think blogging’s plenty for me to start.

I should start participating more in real life communities, but the language barrier makes it hard.

I hope now that life is more stabler in my new home, I could start dedicating more time learning German and able to speak more fluently rather than just listen/read.

I’m sad that Chatterbug shut down though. It was the best online language tutor experience I’ve had.

If you wish to reach out to me, you can always email me. I don’t know how often I’ll do this, but it was nice.

See y’all later o/