<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom"><channel><title>Node.js on Anthony Snavely</title><link>https://anthonysnavely.com/technologies/node.js/</link><description>Recent content in Node.js on Anthony Snavely</description><generator>Hugo</generator><language>en</language><lastBuildDate>Wed, 21 Oct 2026 00:00:00 +0000</lastBuildDate><atom:link href="https://anthonysnavely.com/technologies/node.js/index.xml" rel="self" type="application/rss+xml"/><item><title>Fucking Golf</title><link>https://anthonysnavely.com/showcase/fucking-golf/</link><pubDate>Mon, 28 Sep 2026 00:00:00 +0000</pubDate><guid>https://anthonysnavely.com/showcase/fucking-golf/</guid><description>&lt;p>Top-down, turn-based mini-golf for up to four players per lobby, plus a daily course that everyone plays and compares on one board.&lt;/p>
&lt;h2 id="the-daily">The daily&lt;/h2>
&lt;ul>
&lt;li>&lt;strong>A new course every night.&lt;/strong> A scheduled job asks Claude to design tomorrow&amp;rsquo;s nine holes in a small layout language (shapes, lines, mirrors, hazards), then validates and solves every hole before it goes live. It builds a week ahead and falls back to a procedural course if a night&amp;rsquo;s design fails.&lt;/li>
&lt;li>&lt;strong>Design rules from real play.&lt;/strong> The prompt gets a report of how players actually did on recent holes, and rules that keep things varied: hazards beside the line, holes that don&amp;rsquo;t all play left to right, shaped greens.&lt;/li>
&lt;li>&lt;strong>Replays and share cards.&lt;/strong> Every round is recorded and replayable, and the share card links to a spoiler-safe replay.&lt;/li>
&lt;/ul>
&lt;h2 id="under-the-hood">Under the hood&lt;/h2>
&lt;ul>
&lt;li>Server-authoritative physics. The simulation is deterministic, so a recorded shot replays exactly, and a solver can check every hole is makeable.&lt;/li>
&lt;li>Tile-based map engine with an in-browser editor and a course browser.&lt;/li>
&lt;li>Scores, replays and the daily board in SQLite. Everything else is flat files.&lt;/li>
&lt;li>A home-grown name filter that catches slurs through leetspeak, lookalike alphabets and spacing tricks, checked against a 370k-word dictionary so it doesn&amp;rsquo;t ban Scunthorpe.&lt;/li>
&lt;/ul></description></item><item><title>Fucking Beans</title><link>https://anthonysnavely.com/showcase/fucking-beans/</link><pubDate>Wed, 21 Oct 2026 00:00:00 +0000</pubDate><guid>https://anthonysnavely.com/showcase/fucking-beans/</guid><description>&lt;p>Teams of beans take turns lobbing things at each other across destructible islands. Play against bots at three skill levels, or open a room and send friends the link.&lt;/p>
&lt;h2 id="highlights">Highlights&lt;/h2>
&lt;ul>
&lt;li>&lt;strong>Server-authoritative.&lt;/strong> One shared simulation runs on the server and in the browser for prediction. Terrain and snapshots travel over a compact binary protocol.&lt;/li>
&lt;li>&lt;strong>Pacing came from research.&lt;/strong> A design pass on the genre found match length was what made matches drag, so sudden death now arrives by round and a match runs about 18 to 23 turns.&lt;/li>
&lt;li>&lt;strong>Bots that play the real game.&lt;/strong> The same bots that fill a match drive thousands of headless test games to check the rules and the balance.&lt;/li>
&lt;li>&lt;strong>Map builder&lt;/strong> at &lt;a href="https://beans.fucking.lol/edit" target="_blank" rel="noreferrer noopener">/edit&lt;/a> for drawing your own islands.&lt;/li>
&lt;li>One runtime dependency (&lt;code>ws&lt;/code>).&lt;/li>
&lt;/ul></description></item><item><title>Fucking Penguins</title><link>https://anthonysnavely.com/showcase/fucking-penguins/</link><pubDate>Mon, 01 Jun 2026 00:00:00 +0000</pubDate><guid>https://anthonysnavely.com/showcase/fucking-penguins/</guid><description>&lt;p>Last penguin standing. Steer, boost and bump everyone else off the ice. Modes: Classic free-for-all, 2v2v2 teams, and Power Surge. Quick-play or a private room with a code, plus spectating and a leaderboard.&lt;/p>
&lt;p>A shared simulation runs on both server and client, the server is authoritative, and the only dependencies are &lt;code>ws&lt;/code> and &lt;code>better-sqlite3&lt;/code>.&lt;/p></description></item><item><title>Discord AI Feature Builder</title><link>https://anthonysnavely.com/showcase/discord-ai-feature-builder/</link><pubDate>Wed, 21 Oct 2026 00:00:00 +0000</pubDate><guid>https://anthonysnavely.com/showcase/discord-ai-feature-builder/</guid><description>&lt;p>Someone types &lt;code>/request new&lt;/code> in Discord and describes what they want. The bot opens a GitHub issue and posts an Approve/Reject card. On approval, Claude Code builds it in GitHub Actions and opens a pull request, and the bot posts the link back and @-mentions whoever asked.&lt;/p>
&lt;p>Most &amp;ldquo;AI builds your feature&amp;rdquo; demos skip the three parts that make it safe to actually run, and this one treats them as the product:&lt;/p></description></item></channel></rss>