Josh Hobbs / writing

Josh came from a game server

September 2026

The little version of me walking around this site has a brain adapted from a chatbot I built years ago for a Garry's Mod server. Her name was Alice. Coding agents ported the conversation engine from Lua to JavaScript, then gave it a different job: answer questions about my work.

Alice lived on the Almost There server. The audience she was built for included people trying to annoy her, provoke her, or break things. The old reply table still has entries for insults, demands for admin privileges, and players announcing that they had trapped or removed her. Some replies were functions: she could follow a player, swap positions with one, or change the map under a permission check. Elsewhere in the addon, prop and tool spam had counters, spawning restrictions, and cleanup and kick logic. Conversation shared a home with server administration.

Her dialogue belonged to that environment too: abrasive jokes, insults, and a lot of bait answered with more bait. It was a hand-written collection of patterns and replies, not a model learning from the players. That limited the conversation, but it made the responses inspectable. It did not automatically make them good responses. The old bot even had a “repeat this” handler that echoed input.

For the site, the coding agents separated the matching logic from the dialogue and the browser interface. The useful parts were small: normalize common abbreviations, find a matching pattern, choose a reply, and avoid using the same line repeatedly. The old file also contained commented-out idle timers. Those became the idea behind the cartoon occasionally speaking without being clicked.

On the game serverOn this site
A shared chat channelOpening the chat box addresses the cartoon directly.
Player names and game actionsFixed reply strings, with no player substitution or action callbacks.
Insults and server banterA new set of answers about the projects and writing.
An unmatched question could get silenceA fallback admits the miss and suggests something he knows.

The translation needed behavioral checks. Lua patterns are not JavaScript regular expressions. Abbreviation replacement had to operate on whole words so expanding “u” would not rewrite parts of other words in the same message. A greeting such as “hi” must not match the middle of “this.” The browser version prefers replies it has not used in the last three minutes, but still answers when every option has been used. Tests exercise those cases, including the clock moving past the repeat window.

The hostile audience is relevant to the new job. A visitor can type anything under a drawing of my face. The current engine selects from a finite set of written replies; visitor text does not become a new instruction, an echoed answer, or a game command. Someone can still trigger an irrelevant response by including a matching word. The limit is on what the cartoon can say and do, not a claim that he understands every question.

Coding agents helped build him; they are not choosing his replies during a visit. Optional speech recognition supplies the input, and Kokoro reads the selected line aloud. The matching engine and complete reply collection are small enough to read. Alice's original dialogue stayed behind. The part that survived was the machinery for turning a messy chat message into a bounded response.