All Articles

55 articles published

Robotics/Force Field Mastermind Build

Bots/FF Mastermind: ranged robot pets + Force Field shields for team defense. Forgiving, solid solo past lvl 22. Prioritize shields, Leadership/Fighting pools, Mace Mastery epic for soft-capped defense + high recharge via LotG uniques. Slotting favors pet survivability over damage. Incarnates lean recharge/defense; Lore/Judgement are playstyle calls.

RZ Robert Zehnder coh gaming

Things may look a little different

I rebuilt this blog on boxlang-express, my own Express.js-style BoxLang framework, moving from a CommandBox droplet to a thin DigitalOcean App container, with static assets on Cloudflare R2 and a homegrown MySQL access log replacing GoatCounter. Also: DismalThreads, my BoxLang/CBWire Reddit-style forum, is getting decommissioned end of month, no real users beyond my own test accounts, though the code may go public on GitHub.

RZ Robert Zehnder boxlang bx-express cli

BoxLang Express Enhancements

BoxLang Express went from basic routing to a full-featured framework across 10 releases (0.1.1→0.1.14): sessions, CSRF, CORS, rate limiting, security headers, uploads, and a SQL-backed session store. Every fix got verified live before being called done, then locked in as one of 149 passing tests. Along the way, express-test grew from a chat demo into a live documentation site, catching stale docs and gotchas that reading alone would've missed.

RZ Robert Zehnder boxlang bx-express cli

I built a Slack clone in BoxLang

Robert built a Slack clone on BoxLang with no bundler, no database, no auth. Channels are free because addresses are free. Presence isn't stored, it's derived. DMs are channels with computed names. Two bugs taught me more than the features: frames aren't ordered, and `content-length` counts bytes.

RZ Robert Zehnder boxlang socketbox

Do you want to play a game (again)?

Robert rebuilt his 8-year-old Vue D&D combat app in BoxLang, using SocketBox/WebSockets for real-time state. Features SRD 5.2 character creation, turn-based combat with fog-of-war, and a chunked map system with dual-layer tiles and POI markers. Encounter state lives server-side; ~300 TestBox tests cover it.

RZ Robert Zehnder boxlang gaming socketbox

I asked Claude to describe my personality...

Robert asked Claude to describe their personality without flattery. Claude analyzed author's configuration files, code projects, and documented preferences to generate detailed personality assessment. Key finding: Claude effectively reverse-engineered personality traits from technical documentation and system design patterns, demonstrating how structured configuration files inadvertently reveal behavioral patterns and work preferences.

RZ Robert Zehnder ai claude misc

Do you want to play a game?

Robert ported 1983's Zork to BoxLang to demonstrate natural language parsing without AI models. Transcribed original ZIL (Zork Implementation Language) source from GitHub into BoxLang structs—rooms, objects, exits, synonyms, flags—using Claude for verbatim translation only. Parser handles tokenization and verb resolution like Infocom's original, proving vintage solutions remain viable.

RZ Robert Zehnder boxlang cli gaming

Adding Gamification to DismalThreads

DismalThreads forum implements a gamified achievement system inspired by Dungeon Crawler Carl's snarky tone. Achievements have five tiers (Common to Legendary) plus secret achievements for specific behaviors.

RZ Robert Zehnder boxlang coldbox

Writing Effective Claude Skills

Claude skills are reusable, prompt-based automation shortcuts stored as `SKILL.md` files with YAML frontmatter and Markdown instructions. Best practices: narrow scope (one job per skill), specific instructions with examples, separate process (SKILL.md) from knowledge (REFERENCE.md), use XML tags for structure, control invocation via `disable-model-invocation` and `user-invocable` flags, and iterate based on real outputs.

RZ Robert Zehnder ai claude

Stump the Programmer: The Recursive Shelf

Robert presents a ColdFusion/BoxLang coding challenge to build a recursive function that converts a flat array of hierarchical category data (using `id` and `parent_id` relationships) into a nested tree structure without using loops. The solution uses `arrayFilter()` to find children of each parent and `arrayMap()` to recursively build the `children` array for each node, with an optional bonus feature to alphabetically sort children at each nesting level using a `sortKey` parameter.

RZ Robert Zehnder cfml

Stop Memorizing rsync Flags: Use a Wrapper Instead

`rsync-profiles` is a simple bash wrapper that replaces long, error-prone `rsync` commands with named profiles. Define your source, target, and exclusions in an INI-style config file, then sync with a single command like `rsync-profiles myprofile`. It supports remote servers via SSH, dry-run previews, custom rsync flags, and profile listing. Great for anyone tired of fat-fingering remote paths or digging through bash history to find that one sync command they ran three months ago.

RZ Robert Zehnder cli