Latest articles

Cut the noise: Declarative web components with HTMLElementSugar

HTMLElementSugar simplifies web component development by eliminating boilerplate for attribute definitions, aliases, templates, and configuration inheritance.

Config based git hooks for fun and profit

Git 2.54 adds config-based hooks, letting you share hooks across projects without a shared hooks directory — and without Husky staging a hostile takeover.

How to replicate bum

Bum is small scripts, sensible guardrails, and gitconfig as a runtime — all built on git's own plumbing. No magic, no reinvention. Just git, used well.

All your Traefik are belong to us

Run Traefik as a permanent service on your dev box. One wildcard cert, with real domains, and self-registering Docker projects. Scales to production too.

Greybeards rise

How I unified my entire desktop under one vim colorscheme, iceberg, spanning terminal, prompt, i3, rofi, screensaver, and git. Consistency over aesthetics.

I just wanted PHP 8.2 (Composer had other ideas)

Create a Laravel 12 project targeting PHP 8.2 while running 8.4. Composer said no. This is the docker workaround, and the permission fix that followed.

Yet Another CLI framework

YA::CLI is a Perl CLI framework that eliminates boilerplate by auto-discovering subcommands, handling POD help pages, and using Moo roles — so you just write the logic.

Latest answers

Question: My Debian doesn't boot with a GUI

Troubleshoot Debian not booting to GUI by checking display manager status, systemd targets, and default-display-manager configuration.

Question: How do I register deepin-terminal as an alternative on Debian?

Register custom terminal emulators in Debian's alternatives system using update-alternatives, including --slave option for man page integration.

Question: How does Debian solve converging configuration files?

Learn how to override Debian package configs without losing changes during upgrades using .d directories, ordering, and dpkg-diver

Question: How to avoid killing an i3 scratchpad window

Why i3's scratchpad_state is always none in get_tree, how to find it on the floating_con parent, and a script to avoid killing scratchpad windows by mistake.