Blog
I really like to talk about video games and software development. Writing is how I pin those thoughts down.

What I've been playing lately (July 2026)
I haven't been playing much, actually. Steam Summer Sale 2026 has come and gone and I picked up 2-3 games. The one I've been trying to find time to play the most is Diablo 4 - Vessel of Hatred, the first DLC. The Steam reviews seem quite harsh, but I thoroughly enjoyed the main campaign of the base game. I've been trying to sneak in an hour of gaming on my TV before bed, but I'm probably averaging about an hour per week - a single session. I also own a Steam Deck, which I lug to work in my backpack, for the days I'm in the office. I promise myself that I should use the time I'm on the train for play something , but the lack of a stable network connection has really limited my options. No Diablo 4, for example. But realistically, I've had a passion for building tools lately. I've built and released a binary for managing dragonruby versions and dependencies, drenv . I'll talk more about that later. I also built a tool for my particular home setup, display-switcher . It allows users to setup a group of displays as a group and toggle them on, and the others off, with user-configured hotkeys. For my home setup, I now can press Ctrl+Alt+T and my desktop disconnects from the 2 desk monitors I have setup and enables the TV display I have connected via HDMI. While it's there, it also runs a post-trigger action to turn on Steam Big Picture Mode. I grab my controller and boom, I'm ready to game from my gaming PC on the big screen at home. Ctrl+Alt+D toggles "Desktop Mode" and does the opposite. It exits Big Picture Mode and turns on my desk monitors. Now, for those reading it as I post this, you can probably guess why I started to set this up. The Steam Machine reservations were recently announced and I had put down my interest. I'm genuinely excited to see how much better CEC will feel, but I'm also slightly afraid that the Steam Machine under delivers in terms of my performance expectations. That being said, I have linux-y stuff planned for it anyway - so I'll be happy even if the gaming experience is not quite up to par. Anyway, enough rambling, I guess. I recently revamped my personal website and the blog authoring system, so hopefully, I start making some use of it. Other games I bought include Cross Blitz (Lack of controller support made this less enjoyable than I'd hoped) and God of War . I've barely started God of War, but I know it's going to be amazing. I just need to wait a few more months so I can get a full night's sleep - then I'll have the energy to fully immerse myself into that storyline.
Read post →More writing

Model Structure Done Right
I have been writing Ruby on Rails apps for almost a decade now and I've come to notice that my speed of development inversely scales with how many decisions I have to make. A lot of these decisions come down to lack of structure. But reaching the point where you're comfortable with the final design really is a good feeling. Here are my opinionated best practices for constructing ActiveRecord models: class Post < ApplicationRecord # ================================================== # Module & Concern Includes # ================================================== include ActsAsStateMachine include Commentable # ================================================== # Constants # ================================================== ACTIVE_STATES = %i[published] INACTIVE_STATES = %i[draft discarded] # ================================================== # Default Scope # ================================================== default_scope { kept } # ================================================== # Callbacks # ================================================== before_create :private_method # ================================================== # Non-persistant Attributes # ================================================== attribute :attr1, default: false attr_accessor :attr2 # ================================================== # Associations # ================================================== belongs_to :author has_one :latest_edit, -> { order() }, class_name: 'Edit' has_many :tags accepts_nested_attributes_for :tags # ================================================== # Attachments # ================================================== has_one_attached :cover has_many_attached :previews # ================================================== # Additional Attribute Helpers # ================================================== monetize :price_cents translates :title # ================================================== # Validations # ================================================== validates :title, presence: true, length: { minimum: 10, maximum: 80 } # ================================================== # Scopes # ================================================== scope :active, -> { where(state: ACTIVE_STATES) } scope :inactive, -> { where(state: INACTIVE_STATES) } # ================================================== # Public Instance Methods # ================================================== def current_catalogue_programming(country:) catalogue_programmings.available(country: country).first end # ================================================== # Class Methods # ================================================== def self.average_rating average(:rating) end # ================================================== # Private Methods # ================================================== private def private_method end end

Video games you MUST play before you die
Hades This fast-paced, action, dating-simulator, story-driven, rogue-like game is basically a masterpiece. The game hooks you with engaging combat mechanics while maintaining momentum through its narrative depth and unlockable content. Gameplay 10 Art Style 10 Soundtrack 10 Story 10 Northgard An RTS with Nordic aesthetics, Northgard combines traditional strategy elements like research trees and resource management with distinctive clan mechanics that differentiate gameplay experiences. Each faction offers unique variations: some possess exclusive research paths, others feature specialized units or distinctive Warchief characters. Gameplay 8 Art Style 9 Soundtrack 9 Story 7 League of Legends League of Legends is 1 of the 2 MOBA games you just shouldn't miss, the obvious other being DOTA 2. With 154 champions available, the game generates an astronomical number of possible team compositions, ensuring unique matches consistently. Gameplay 9 Art Style 9 Soundtrack 7 Story 8