About the Author

Robert Zehnder

admin

I am just this guy, you know?

I'm a senior ColdFusion developer who's been in the CFML trenches long enough to have opinions about all of it — from crusty tag-based components to whatever comes next. Most of my day job is stitching e-commerce platforms together (Shopify, Amazon, eBay, Walmart, and a few you've probably never had to integrate with) so that inventory and orders don't lie to each other.

Outside work I build things nobody asked for. I wrote my own Express.js-style module for BoxLang because there were no alternatives, then used it to rebuild my own blog. I ported Zork. When I'm not writing code, I'm reading Dungeon Crawler Carl, James S.A. Corey, or Rothfuss, min-maxing a City of Heroes build, or doing calisthenics because apparently that's a thing now.

I like systems with real rules and earned progression — in games, in code, in most things. If it's held together with duct tape, I probably built the duct tape myself and documented why.

What's in BoxExpress Today

BoxExpress is an Express.js-style web framework for BoxLang, running on Undertow with a virtual thread per request — no servlet container needed. It covers routing, middleware, sessions, views, file serving, WebSockets, a full STOMP broker, and a scheduler. New: cross-process cluster support, with leader-elected scheduled jobs and STOMP pub/sub relayed across instances, backed by a durable shared cache. Real example apps: bxThreads (forum) and bx-graphql-demo.

Robert Zehnder boxlang bx-express

bxThreads: a bx-express port of DismalThreads

Ported my forum app (DismalThreads) from ColdBox/CBWIRE to BoxLang/boxlang-express as bxThreads — swapping CBWIRE's component reactivity for hand-rolled fetch()/websockets. Porting a real app with existing opinions (auth, rate limiting, realtime fan-out) is a better BoxLang stress test than starting fresh, since a blank project lets you dodge every hard problem by never hitting it.

Robert Zehnder boxlang bx-express

Spines / Fire Brute — AE Fire Farm Build Guide

Spines/Fire is one of Homecoming's premier farming Brutes. Spines delivers relentless AoE via Quills, Spine Burst, and Throw Spines, while Fiery Aura brings strong resists, Healing Flames for sustain, and Fiery Embrace for burst damage. Cap fire defense at 45% (Weave, Maneuvers, Fire/Plasma Shield, set bonuses) and you're nearly untouchable on fire-only farm maps. Fast Fury generation, minimal downtime, and huge influence-per-hour make it the classic "bootstrap" alt to fund your other toons.

Robert Zehnder coh gaming

Adding SSE and WebSockets to BoxExpress (and Everything That Broke Along the Way)

BoxExpress adds server-sent events and full WebSocket support for pushing live updates to clients — dashboards, progress bars, chat, notifications. Built from scratch, since BoxExpress skips BoxLang's built-in web layer. Along the way: a concurrency bug in broadcast connections, a header-injection-style hole in SSE metadata, a BoxLang update that broke page rendering, and a STOMP bug letting one client hijack another's subscription. All caught by trying to break it.

Robert Zehnder boxlang bx-express

BoxLang and GraphQL

bx-graphql brings GraphQL to native BoxLang via graphql-java, wrapping it in a schema-agnostic module with convention-based resolvers and zero framework lock-in. To prove it out beyond source code, Robert built a fully offline demo pairing it with boxlang-express — a JSONPlaceholder-style schema, thin resolvers that mostly fall through to `PropertyDataFetcher`, and a no-build-step query console. Both modules are live on ForgeBox: `box install` and go.

Robert Zehnder boxlang graphql

BoxLang Express Development Update 8/26

BoxExpress 0.1.15→0.2.1: five patch releases fixed empty-value crashes (query/cookie/multipart), hardened proxy-IP trust for real platforms, fixed session data loss against non-memory stores, added response outcome accessors and opt-out session writes, and closed a trailing-slash bug hitting nearly every request. Then 0.2.0 replaced the JDK's HttpServer with Undertow entirely (breaking), verified at full parity and load-tested. 0.2.1 added live HTTP-layer metrics via getConnectorStatistics().

Robert Zehnder boxlang bx-express cli