DevCharms
DevCharms is my software development blog and portfolio—engineering notes, code snippets from challenges and experiments, and stories from shipping real work.
Read the blog posts or see README for setup and project details.
Featured
Why email forwarding broke
Posted on:October 28, 2026 at 12:30 PMForwarding worked for decades, then banks started bouncing it. Here's why spoofing checks break a forward, how to prove it with one command, and a way off the habit that isn't cold turkey.
Turn Your Idle Terminal into a Retro Screensaver with Native Zsh and Homebrew
Posted on:October 15, 2026 at 07:00 PMDitch abandoned third-party plugins. Configure automated, randomized ASCII screensavers directly in Zsh using native traps and lightweight CLI tools.
Taming WordPress Multisite Bottlenecks: Bot Mitigation & Cron Health with a Custom Plugin
Posted on:July 28, 2026 at 12:50 PMLearn how a custom WordPress network plugin resolves performance bottlenecks on a high-traffic multisite setup. Discover how early-exit bot firewalls block username enumeration attacks while targeted database pruning prevents WP-Cron option array bloat.
Reasons to set up a Cloudflare Tunnel
Posted on:June 20, 2026 at 10:00 AMWhy outbound-only Cloudflare Tunnels beat port forwarding for self-hosted apps, homelabs, and services you want online without opening your network to the internet.
Hunting Dictionary Bots: Inside a Sophisticated WordPress Membership Attack
Posted on:May 27, 2026 at 12:00 PMModern "dictionary bots" can bypass CAPTCHAs and WAFs to spam WordPress membership signups. Learn how the attack works—and how to block it in code.
@container: responsive layout that follows the component, not the viewport
Posted on:April 7, 2026 at 12:00 PMContainer queries and the @container rule let you style elements from their parent's width—so cards, sidebars, and embeds adapt inside columns and grids without viewport media queries.
How CSS cascade layers let you win with lower specificity
Posted on:March 30, 2026 at 12:00 PMUsing the @layer at-rule to order resets, components, and utilities so layer order does the heavy lifting—fewer chained selectors and less need for !important.
Why CSS logical properties are the efficient default
Posted on:March 27, 2026 at 02:00 PMHow margin-inline, padding-block, and friends replace left/right gymnastics with fewer declarations and better RTL and writing-mode behavior—without extra media queries.
The bug that taught me to read the docs
Posted on:March 5, 2025 at 02:30 PMA short story about chasing a "mystery" production issue that turned out to be documented behavior—and what I changed in how I work afterward.
A fresh start for DevCharms
Posted on:March 1, 2025 at 12:00 PMWhy this site got a clean slate, what you can expect from the blog from here on out, and how we are thinking about shipping useful stories—not theme demos.
Recent Posts
Why email forwarding broke
Posted on:October 28, 2026 at 12:30 PMForwarding worked for decades, then banks started bouncing it. Here's why spoofing checks break a forward, how to prove it with one command, and a way off the habit that isn't cold turkey.
Turn Your Idle Terminal into a Retro Screensaver with Native Zsh and Homebrew
Posted on:October 15, 2026 at 07:00 PMDitch abandoned third-party plugins. Configure automated, randomized ASCII screensavers directly in Zsh using native traps and lightweight CLI tools.
Taming WordPress Multisite Bottlenecks: Bot Mitigation & Cron Health with a Custom Plugin
Posted on:July 28, 2026 at 12:50 PMLearn how a custom WordPress network plugin resolves performance bottlenecks on a high-traffic multisite setup. Discover how early-exit bot firewalls block username enumeration attacks while targeted database pruning prevents WP-Cron option array bloat.
Reasons to set up a Cloudflare Tunnel
Posted on:June 20, 2026 at 10:00 AMWhy outbound-only Cloudflare Tunnels beat port forwarding for self-hosted apps, homelabs, and services you want online without opening your network to the internet.