<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:dc="http://purl.org/dc/elements/1.1/">
  <channel>
    <title>DEV Community: Tony Costanzo</title>
    <description>The latest articles on DEV Community by Tony Costanzo (@patrity).</description>
    <link>https://dev.to/patrity</link>
    <image>
      <url>https://media2.dev.to/dynamic/image/width=90,height=90,fit=cover,gravity=auto,format=auto/https:%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F1063068%2F7118555a-626e-403a-b3cf-410bd46d0061.jpeg</url>
      <title>DEV Community: Tony Costanzo</title>
      <link>https://dev.to/patrity</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/patrity"/>
    <language>en</language>
    <item>
      <title>I Billed Myself for 6.7 Billion Tokens and the Total Came Out to $35.85</title>
      <dc:creator>Tony Costanzo</dc:creator>
      <pubDate>Wed, 08 Jul 2026 11:30:08 +0000</pubDate>
      <link>https://dev.to/patrity/i-billed-myself-for-67-billion-tokens-and-the-total-came-out-to-3585-li7</link>
      <guid>https://dev.to/patrity/i-billed-myself-for-67-billion-tokens-and-the-total-came-out-to-3585-li7</guid>
      <description>&lt;blockquote&gt;
&lt;p&gt;This one originally went up on &lt;a href="https://www.techhivelabs.net/blog/local-ai-true-cost" rel="noopener noreferrer"&gt;my blog&lt;/a&gt;.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;h2&gt;
  
  
  My Model Got Called Illiterate
&lt;/h2&gt;

&lt;p&gt;My friends spent the weekend trash-talking the new coding model on my rig. By the time I finished defending its honor, I had priced every token my GPUs have ever produced and drafted a passive-aggressive invoice to the cloud.&lt;/p&gt;

&lt;p&gt;Quick context for the new folks: I run a four-GPU homelab rig that serves coding models to a handful of people over &lt;a href="https://github.com/BerriAI/litellm" rel="noopener noreferrer"&gt;LiteLLM&lt;/a&gt;. Last week I swapped the coder from Qwen3.6-35B-A3B to Ornith-1.0-35B, a DeepReinforce fine-tune built for agentic coding that benches a couple points higher on SWE-Bench (75.6 vs ~73.4). Getting it to boot took a &lt;a href="https://github.com/vllm-project/vllm" rel="noopener noreferrer"&gt;vLLM&lt;/a&gt; upgrade and five sequential startup failures, which is a war story for another post.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2F89iivaqf5zqofjur7era.webp" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2F89iivaqf5zqofjur7era.webp" alt="The AI rig: four RTX 3090s on an open mining frame" width="800" height="600"&gt;&lt;/a&gt;&lt;br&gt;
&lt;em&gt;The defendant's residence. Four 3090s on a mining frame, and yes, the RGB is load-bearing.&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;The point is, the community was raving about this model. Then my users started filing complaints:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;em&gt;"this model misspells shit a lot"&lt;/em&gt;&lt;/li&gt;
&lt;li&gt;&lt;em&gt;"spent about 10 minutes deleting a file and recreating it, forgot what its original task was"&lt;/em&gt;&lt;/li&gt;
&lt;li&gt;&lt;em&gt;"big habit of deleting the whole file it's working on and trying to rewrite it all even though it's just missing imports"&lt;/em&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;So either every reviewer on the internet was wrong, or something about &lt;em&gt;my&lt;/em&gt; serving setup was making a good model act like it had a concussion. I had a suspect. It was me.&lt;/p&gt;

&lt;h2&gt;
  
  
  Subpoenaing My Own Request Logs
&lt;/h2&gt;

&lt;p&gt;Here's a thing I didn't fully appreciate until this week: LiteLLM stores the raw request body of every call in its spend logs. Every parameter every client ever sent. It's a full forensic record, sitting in Postgres, waiting for someone to have a bad enough week to read it.&lt;/p&gt;

&lt;p&gt;I pulled every Ornith-era request for the heaviest user's key. 2,706 requests. 2,703 of them sent no &lt;code&gt;temperature&lt;/code&gt; at all.&lt;/p&gt;

&lt;p&gt;When the client doesn't send a temperature, vLLM falls back to whatever the model's generation config says. This quant's default: &lt;strong&gt;1.0&lt;/strong&gt;. Combined with the &lt;code&gt;top_p&lt;/code&gt; of 1.0 the client &lt;em&gt;did&lt;/em&gt; send, my users were generating production code at near-maximum randomness. The misspellings weren't a model problem.. they were a dice-rolling problem.&lt;/p&gt;

&lt;p&gt;Yikes.&lt;/p&gt;

&lt;p&gt;And that was just the first charge. The logs kept talking:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;The contexts were enormous.&lt;/strong&gt; Average prompt: 105,394 tokens. The biggest: 230,071, damn near the model's 262K ceiling. Roughly a third of all requests came in over 140K.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;My fp8 KV cache was quietly taxing those deep contexts.&lt;/strong&gt; Squeezing the cache to 8-bit is how I bought headroom, but at 100K+ tokens the precision loss is real. That's your "forgot what its original task was."&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Thinking was disabled globally.&lt;/strong&gt; I'd turned it off for my other workloads. For a model whose entire party trick is reasoning through a plan before acting, that explains the "rewrite the whole file to fix one import" behavior.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The control group sealed it: completions in the 44K to 56K range were clean, articulate, multi-step debugging. The model was fine. The config was drunk.&lt;/p&gt;

&lt;h2&gt;
  
  
  The Fix Cost Nothing (My Favorite Price)
&lt;/h2&gt;

&lt;p&gt;Two things I learned fixing this, and both were free:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Sampling params ride along per request.&lt;/strong&gt; One loaded model can behave completely differently per consumer. I made a second LiteLLM model entry, &lt;code&gt;ornith-thinking&lt;/code&gt;, pointing at the same backend with &lt;code&gt;temperature: 0.2&lt;/code&gt; and thinking enabled baked in. The coding folks switch one config line. My other consumers (a security camera captioner, my knowledge base, a chat UI) keep their fast no-thinking behavior and never notice.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;This model's KV cache is comically small.&lt;/strong&gt; Ornith uses aggressive GQA with only 2 KV heads, so I checked whether I even needed fp8 anymore. Turns out fp16 still fits the entire 262K context with room for ~3 fully-maxed concurrent requests, and about 8 at my users' average context size. Peak concurrency ever observed on this box: 4. I was paying a precision tax to buy concurrency nobody was using.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;So the deep-context degradation fix was literally &lt;em&gt;removing&lt;/em&gt; a flag. I love it when the answer is deleting something.&lt;/p&gt;

&lt;h2&gt;
  
  
  The Rabbit Hole Under the Spend Tables
&lt;/h2&gt;

&lt;p&gt;Now, while I was elbow-deep in LiteLLM's spend tables gathering evidence, something kept bugging me. Every local request had a spend of $0.00. Which is adorable, but wrong. These tokens aren't free.. I pay for them in electricity, and I had all the data to compute exactly how much.&lt;/p&gt;

&lt;p&gt;My Prometheus setup already scrapes per-GPU power draw and vLLM throughput. The math is one line:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Energy per token&lt;/strong&gt; = watts / (tokens per second)&lt;/li&gt;
&lt;li&gt;The two coder GPUs pull ~700W under load (power-capped 3090s)&lt;/li&gt;
&lt;li&gt;Decode runs ~130 tok/s, so each output token costs &lt;strong&gt;5.4 joules&lt;/strong&gt;
&lt;/li&gt;
&lt;li&gt;Prefill chews ~6,000 tok/s, so each input token costs &lt;strong&gt;0.12 joules&lt;/strong&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;At my rate of $0.1395/kWh, that lands here:&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;&lt;/th&gt;
&lt;th&gt;$ per 1M tokens&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Input (prefill)&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;$0.0045&lt;/strong&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Output (decode)&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;$0.21&lt;/strong&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;Prefill is ~46x cheaper per token than decode because it batches, which matters enormously when your workload is agents stuffing entire repos into every prompt.&lt;/p&gt;

&lt;p&gt;Honesty corner, because I hate cost posts that hide the asterisks: this is &lt;em&gt;marginal&lt;/em&gt; cost. It excludes idle power, cooling, and hardware amortization. And the prefill throughput is estimated, not measured, so the input rate is the softest number in this post. Sanity check though: it prices my last 7 days of usage at about $6.90, call it $30/month of coder electricity, which matches what the rig actually pulls. The math holds.&lt;/p&gt;

&lt;h2&gt;
  
  
  The Part Where the Cloud Should Blush
&lt;/h2&gt;

&lt;p&gt;I set those per-token prices on the local models and backfilled every request LiteLLM has ever logged. All-time damage across every local coding model since April: &lt;strong&gt;6.67 billion input tokens, 27.8 million output tokens, $35.85 in electricity.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Then I priced the identical token volume at &lt;a href="https://openrouter.ai/qwen/qwen3.6-35b-a3b" rel="noopener noreferrer"&gt;OpenRouter's rate&lt;/a&gt; for Qwen3.6-35B-A3B, the exact architecture Ornith is fine-tuned from, at $0.14/M in and $1.00/M out. Same tokens, their bill: &lt;strong&gt;~$961&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fclx7ru6jk2mny1a6mk30.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fclx7ru6jk2mny1a6mk30.png" alt="Bar chart comparing the all-time cost of 6.7 billion tokens: $35.85 of local electricity vs an estimated $961 at OpenRouter rates, roughly 27 times more" width="800" height="296"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;That's ~27x cheaper on marginal cost, and OpenRouter's open-model pricing is &lt;em&gt;already&lt;/em&gt; the cheap option. Input tokens are the absurd part: 31x cheaper locally, on the exact token type my agentic workload mainlines.&lt;/p&gt;

&lt;p&gt;Before anyone yells at me (again), yes, the comparison is electricity vs fully-loaded cloud. So let's load it: the rig cost about $6k, which amortizes to ~$167/month over three years. The coder workload alone has been producing $320 to $480/month of cloud-equivalent value. It pays the rig's mortgage two or three times over before counting anything else the box does (image gen, voice, embeddings.. you name it).&lt;/p&gt;

&lt;h2&gt;
  
  
  Where 6.7 Billion Tokens Actually Went
&lt;/h2&gt;

&lt;p&gt;Backfilling spend meant I could finally answer a question I'd never thought to ask: what is actually &lt;em&gt;eating&lt;/em&gt; my rig? I mapped every API key to its workload and grouped all-time usage.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fyfvri71f2momwc4fxa91.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fyfvri71f2momwc4fxa91.png" alt="Bar chart of all-time input tokens by workload: the always-on assistant used 4.75 billion (71.4%), agentic coding 1.88 billion (28.2%), vision and security 15.6 million (0.23%), and the second brain 13.6 million (0.20%)" width="800" height="404"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;The results broke my mental model of my own homelab:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;The always-on assistant dominates everything.&lt;/strong&gt; Hermes, my 24/7 messaging agent, has quietly pushed 4.75 billion tokens.. 71% of all local inference ever. Total electricity: about $26. A billion tokens a month of ambient assistant costs less than a pizza.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Coding is the heavyweight per request, not per volume.&lt;/strong&gt; 28% of the tokens from just 12% of the requests, averaging ~97K tokens per request. Agentic coding tools shove the whole repo into every single turn.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;The "second brain" is a rounding error.&lt;/strong&gt; My knowledge base and memory agents, the thing people assume is the token hog, used 13.6 million tokens all-time. Twenty-two cents. The chat agent out-consumed it 350x, purely by never shutting up.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Vision is cheap and bursty.&lt;/strong&gt; The security cameras fire thousands of tiny ~1.9K-token requests. 5% of requests, 0.23% of tokens.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fqjrnbj0sy1qx6z96tt1t.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fqjrnbj0sy1qx6z96tt1t.png" alt="Grouped bar chart comparing each workload's share of requests vs share of input tokens: the assistant is 82% of requests and 71% of tokens, coding is 12% of requests but 28% of tokens, vision is 5% of requests and 0.2% of tokens, second brain is 1.5% of requests and 0.2% of tokens" width="800" height="446"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Three Traps I Sprung So You Don't Have To
&lt;/h2&gt;

&lt;p&gt;If you want to do this backfill on your own LiteLLM box, learn from my bruises:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;&lt;code&gt;/model/update&lt;/code&gt; silently drops custom cost fields.&lt;/strong&gt; &lt;code&gt;input_cost_per_token&lt;/code&gt; and &lt;code&gt;output_cost_per_token&lt;/code&gt; only stick if you delete the model and recreate it via &lt;code&gt;/model/new&lt;/code&gt;. No error, no warning. The API just quietly disagrees with you.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Spend lives in three places, and the UI reads the one you'd guess last.&lt;/strong&gt; Per-request spend logs, per-key running totals, and daily aggregate tables. The usage dashboard reads the &lt;em&gt;daily&lt;/em&gt; tables, so backfilling only the request logs changes nothing on screen. Ask me how long that took me to figure out.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Reconcile key totals additively, never from scratch.&lt;/strong&gt; Old spend logs get pruned while key counters persist. Two of my keys held $42 of real recorded spend with zero surviving log rows. A naive &lt;code&gt;spend = sum(logs)&lt;/code&gt; would have erased history, and bumping totals can also trip keys with budgets, so guard for that too.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;LiteLLM has strong opinions about its spend tables. Now I have strong opinions about its opinions.&lt;/p&gt;

&lt;h2&gt;
  
  
  Case Closed
&lt;/h2&gt;

&lt;p&gt;So the model was never drunk. My config was rolling dice at temperature 1.0, compressing memories at 200K context, and lobotomizing a reasoning model's ability to reason. Ornith is owed a formal apology from at least three people, and I've sent mine.&lt;/p&gt;

&lt;p&gt;The real souvenir is that number though. Every token my coding stack has ever produced, 6.7 billion of them, cost me less than a family dinner. The cloud wanted a grand for the same work.&lt;/p&gt;

&lt;p&gt;My friends are back to happily burning 97K tokens per request like it's nothing. Because at $0.0045 per million, it basically is.&lt;/p&gt;

&lt;p&gt;Go bill yourself. It's weirdly satisfying.&lt;/p&gt;

</description>
      <category>ai</category>
      <category>llm</category>
      <category>devops</category>
      <category>selfhosted</category>
    </item>
    <item>
      <title>I Run AI Agents Around the Clock and My Best Productivity Tool This Year Has No Battery</title>
      <dc:creator>Tony Costanzo</dc:creator>
      <pubDate>Thu, 18 Jun 2026 10:32:20 +0000</pubDate>
      <link>https://dev.to/patrity/i-run-ai-agents-around-the-clock-and-my-best-productivity-tool-this-year-has-no-battery-172b</link>
      <guid>https://dev.to/patrity/i-run-ai-agents-around-the-clock-and-my-best-productivity-tool-this-year-has-no-battery-172b</guid>
      <description>&lt;blockquote&gt;
&lt;p&gt;This one originally went up on &lt;a href="https://www.techhivelabs.net/blog/de-digitizing" rel="noopener noreferrer"&gt;my blog&lt;/a&gt;.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;h2&gt;
  
  
  The Most Analog Thing I've Done in Years
&lt;/h2&gt;

&lt;p&gt;I have a four-GPU AI rig humming in my house. I've got a homelab agent that pings my Telegram the second something breaks. I've automated chunks of my life that most people don't know can be automated.&lt;/p&gt;

&lt;p&gt;And the single best productivity change I made this year was buying a notebook and a pen.&lt;/p&gt;

&lt;p&gt;I know how that sounds. Believe me, I know. The guy who writes blog posts about vLLM quantization and self-hosted inference is here to tell you about.. journaling. Stay with me, because the irony is kind of the whole point.&lt;/p&gt;

&lt;h2&gt;
  
  
  It Started, Like Most of My Bad Decisions, at the Mall
&lt;/h2&gt;

&lt;p&gt;Last year I was wandering The Galleria in Houston and walked into the Mont Blanc store. My dad always had a Mont Blanc when I was growing up, so the name had a pull on me I didn't fully understand at the time. I wasn't going to buy anything, I just wanted to look.&lt;/p&gt;

&lt;p&gt;So of course I tested one. And it was genuinely lovely.. right up until I saw my own handwriting on the page. Mine is terrible. Always has been. Dropping Mont Blanc money to make my chicken scratch more expensive felt like buying a Ferrari to sit in traffic, so I capped the pen, set it down, and walked out.&lt;/p&gt;

&lt;p&gt;That should have been the end of it. Then about a month ago a &lt;a href="https://www.youtube.com/watch?v=gsXKUGacVF4" rel="noopener noreferrer"&gt;YouTube video about fountain pens&lt;/a&gt; landed in my feed and dragged the whole itch right back out. Like Betty from that video, I had no idea something so simple had so much depth. She pointed me at a Lamy Safari, which runs about half of what a Mont Blanc costs in sales tax. Sold.&lt;/p&gt;

&lt;p&gt;Once I actually had a pen I liked, the pen stopped being the point. The writing did. I'd spent the first half of this year building out a personal "knowledge base" to finally get organized, and the idea of doing some of that thinking by hand wouldn't leave me alone.&lt;/p&gt;

&lt;h2&gt;
  
  
  Turns Out There's a Method to the Madness
&lt;/h2&gt;

&lt;p&gt;Down the research rabbit hole I went, and I found the Bullet Journal method. It's a stupidly simple system for categorizing quick notes, and it clicked instantly because it reads like markdown for paper.&lt;/p&gt;

&lt;p&gt;Naturally, I couldn't leave it alone. I tweaked the key until it matched the way my brain already works:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;•&lt;/strong&gt; a task&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;x&lt;/strong&gt; task done&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;/&lt;/strong&gt; task started&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;&amp;gt;&lt;/strong&gt; task I'm pushing to tomorrow&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;&amp;lt;&lt;/strong&gt; task I canceled&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;-&lt;/strong&gt; a quick note&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;*&lt;/strong&gt; an important note (admittedly subjective)&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;○&lt;/strong&gt; an event&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;If you've ever written a markdown checklist, this is the same muscle. I'm not parsing it with a tokenizer, I'm parsing it with my eyeballs at 4 in the morning, but the instinct is identical.&lt;/p&gt;

&lt;h2&gt;
  
  
  One Brain, Six Boxes
&lt;/h2&gt;

&lt;p&gt;Once the key felt right, I built a weekly layout. Two pages, each split into three, so six boxes total: one for every workday and a big one for the weekend.&lt;/p&gt;

&lt;p&gt;On Sunday I sit down and rough out the week at a high level. The decision that actually changed things was refusing to separate my domains. Work, side projects, life.. all of it goes in the same six boxes. One centralized brain dump, which is sort of the entire point.&lt;/p&gt;

&lt;p&gt;So a single week's spread might hold:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Work:&lt;/strong&gt; database cleanups, the weekly migration, UAT acceptance.. the usual EPC data gremlins&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;&lt;a href="https://thundoria.com" rel="noopener noreferrer"&gt;Thundoria&lt;/a&gt;:&lt;/strong&gt; rework the inventory system, balance some enemy NPCs, build a changelog&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Life:&lt;/strong&gt; Kid's sporting events, important dates, the works&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;This sounds insultingly basic. Plan your week, write it down. And yet, looking back, I genuinely don't know how I functioned before.&lt;/p&gt;

&lt;p&gt;Actually, I do know. I was a "vibe coder" before AI was commercialized. I executed work based on vibes and how I felt that day, hour, minute. If I woke up and felt like pivoting my fourth million-dollar SaaS idea in a completely new direction, cool, sounds fun, let's go. No plan, just vibes and caffeine.&lt;/p&gt;

&lt;h2&gt;
  
  
  Putting Pen to Paper (Literally)
&lt;/h2&gt;

&lt;p&gt;The game changer wasn't the clever key or the six little boxes. It came down to one stupidly old phrase: putting pen to paper.&lt;/p&gt;

&lt;p&gt;Journaling, the bullet method, the custom symbols.. none of that is the magic. They're just outlets. The actual shift was stopping, taking a breath, and thinking about what I was about to do before I did it.&lt;/p&gt;

&lt;p&gt;That's embarrassingly hard now. We're drowning in pings. Social media notifications, Telegram messages from my homelab agent, Reddit alerts about cheap GPUs I absolutely do not need more of. Every one of those is a tiny hand reaching out to yank my attention somewhere else.&lt;/p&gt;

&lt;p&gt;Putting the phone down and picking the pen up broke the loop. No notes app, no task manager, no productivity suite synced across six devices. Just a page that can't notify me about anything.&lt;/p&gt;

&lt;h2&gt;
  
  
  My 4 AM Half-Page
&lt;/h2&gt;

&lt;p&gt;I get to work early. 4 to 4:30 in the morning. The first 15 minutes now belong to the notebook, and the routine is always the same half page:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;A sentence or two on me:&lt;/strong&gt; how I slept, how I'm feeling, what the day's got waiting&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Three to five tasks&lt;/strong&gt; I actually want to finish today, cross-checked against Sunday's weekly plan&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;A quote of the day&lt;/strong&gt;, which I get by asking Claude for something that'll resonate with me (yes, the AI guy uses the AI for his analog journal, the hypocrisy is noted)&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Then I set the notebook right next to my keyboard, a glance away, and I get to work. As the day throws things at me, I log them in real time:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Joe Shmoe needs earned value data pulled for the past week&lt;/li&gt;
&lt;li&gt;Jane Doe wants a UX feature added to one of the apps&lt;/li&gt;
&lt;li&gt;Wife called, grab bread on the way home&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Little things. The exact little things that used to evaporate the second a Teams message landed on top of them.&lt;/p&gt;

&lt;h2&gt;
  
  
  The Part Where I Take Off the Apple Watch
&lt;/h2&gt;

&lt;p&gt;This is the bit I keep coming back to, because it's where it stopped being about a notebook and started being about something bigger.&lt;/p&gt;

&lt;p&gt;I'm 33. I've made peace with the fact that I'm scatterbrained. I do it to myself, juggling something like 48 projects at once, and I'm not proud of it.. but I genuinely work well in chaos. The notebook didn't fix that. It just gave the chaos structure.&lt;/p&gt;

&lt;p&gt;So I kept pulling threads. I stopped opening my phone "real quick" only to surface 40 minutes later on TikTok with no memory of why I unlocked it. I took off the Apple Watch that buzzed my wrist every ten seconds and put my old analog watch back on. A watch that tells time. That's the whole feature list.&lt;/p&gt;

&lt;p&gt;I'm an avid tech guy who looked at his own setup and decided to de-digitize parts of it. Not all of it. Just the parts that were quietly running me instead of the other way around.&lt;/p&gt;

&lt;h2&gt;
  
  
  Controlled Chaos
&lt;/h2&gt;

&lt;p&gt;I'm not going to pretend a notebook turned me into a calm, organized person. It didn't. I'm still juggling 48 projects, still up before the sun, still one good benchmark away from buying another GPU I don't need (don't tell my wife).&lt;/p&gt;

&lt;p&gt;The difference is that now it's controlled chaos. Same mess, but I'm holding the leash instead of getting dragged behind it.&lt;/p&gt;

&lt;p&gt;Funny how that worked out. I spent years and a small fortune building systems to manage my brain, and the thing that finally did it was a thirty-dollar Lamy and a notebook.. no firmware, no notifications, a battery life measured in ink.&lt;/p&gt;

&lt;p&gt;My handwriting has only gotten marginally better, for the record. But I fill that notebook every single morning now, which is more than any app on my phone can say. So maybe one of these days, once I've actually earned it, I'll walk back into that Mont Blanc store and buy the thing my dad always carried.&lt;/p&gt;

</description>
      <category>productivity</category>
      <category>devjournal</category>
      <category>notes</category>
      <category>devlife</category>
    </item>
    <item>
      <title>I Spent 22 Years Programming Just to Fail at Making a Skeleton Swing a Sword</title>
      <dc:creator>Tony Costanzo</dc:creator>
      <pubDate>Fri, 29 Aug 2025 15:43:11 +0000</pubDate>
      <link>https://dev.to/patrity/i-spent-22-years-programming-just-to-fail-at-making-a-skeleton-swing-a-sword-455o</link>
      <guid>https://dev.to/patrity/i-spent-22-years-programming-just-to-fail-at-making-a-skeleton-swing-a-sword-455o</guid>
      <description>&lt;p&gt;&lt;em&gt;Originally published at &lt;a href="https://techhivelabs.net/blog/thundoria-architecture" rel="noopener noreferrer"&gt;techhivelabs.net&lt;/a&gt;&lt;/em&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Links
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;&lt;a href="https://thundoria.com" rel="noopener noreferrer"&gt;Thundoria Site&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://x.com/ThePatrity" rel="noopener noreferrer"&gt;X / Twitter&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://bsky.app/profile/patrity.com" rel="noopener noreferrer"&gt;Blue Sky&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;h1&gt;
  
  
  Why I'm Building an MMORPG (By Learning How NOT to Build One First)
&lt;/h1&gt;

&lt;h2&gt;
  
  
  Every Game Developer Tells Us The Same Thing...
&lt;/h2&gt;

&lt;p&gt;"Don't build an MMO."&lt;/p&gt;

&lt;p&gt;It's literally the first rule of indie game devs. Right up there with "start small" and "your first 10 games will suck." And you know what? After 22 years of programming and two months of trying to build one, can confirm: they're absolutely right.&lt;/p&gt;

&lt;p&gt;The thing is.. I'm still going to build my MMORPG. I'm just taking a massive detour through a completely different game first. Let me explain why building my dream game meant stepping the hell away from it.&lt;/p&gt;

&lt;h2&gt;
  
  
  From RuneScape Private Servers to Full-Stack Development
&lt;/h2&gt;

&lt;p&gt;My programming journey started when I was 11, doing what any reasonable (totally not degenerate) pre-teen would do in 2004: hacking together RuneScape private servers so I could spawn max cash stacks and party hats. Those early days of tearing apart poorly-written Java codebases by other degenerates taught me one thing exceptionally well: how to duct-tape other people's code together until it (mostly) worked.&lt;/p&gt;

&lt;p&gt;Over the years, I graduated from game server shenanigans to real backend development. I built RESTful APIs, managed millions of rows of data for EPC contractors, and became what I'd call a "real programmer." Java, Kotlin, Python, TypeScript, PostgreSQL, microservices.. you name it, I could architect it.&lt;/p&gt;

&lt;p&gt;But deep down? I never stopped scoping out game ideas in markdown files. Mountains of them.&lt;/p&gt;

&lt;h2&gt;
  
  
  Enter Thundoria: My Beautiful, Overscoped Monster
&lt;/h2&gt;

&lt;p&gt;Earlier this year, I finally said "screw it" and started building &lt;strong&gt;&lt;a href="https://thundoria.com" rel="noopener noreferrer"&gt;Thundoria&lt;/a&gt;&lt;/strong&gt;, a browser-based multiplayer roguelike bullet-hell with:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Procedurally generated dungeons&lt;/li&gt;
&lt;li&gt;Real-time multiplayer combat&lt;/li&gt;
&lt;li&gt;RPG progression systems (because why not?)&lt;/li&gt;
&lt;li&gt;Crafting, fishing, mining (who doesn't love scope creep)&lt;/li&gt;
&lt;li&gt;Social features like guilds and parties&lt;/li&gt;
&lt;li&gt;And yes... it's an MMO&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;em&gt;[Want to watch this trainwreck unfold? Join the mailing list at &lt;a href="https://thundoria.com" rel="noopener noreferrer"&gt;thundoria.com&lt;/a&gt;!]&lt;/em&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  The Technical Flex That Nobody Asked For
&lt;/h3&gt;

&lt;p&gt;In two months of near-daily work, I built some fairly impressive infra:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;NuxtJS Frontend:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Supabase auth with JWT passthrough to the game client&lt;/li&gt;
&lt;li&gt;Embedded game frame with seamless auth&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Kotlin Service Layer:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;RESTful API for game server orchestration&lt;/li&gt;
&lt;li&gt;Dynamic instance balancing&lt;/li&gt;
&lt;li&gt;Procedural map generation&lt;/li&gt;
&lt;li&gt;HTTP map data serving to both client and server&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Nakama Game Server (Go):&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Multi-character system per account&lt;/li&gt;
&lt;li&gt;Server-authoritative collision detection using map data from Kotlin&lt;/li&gt;
&lt;li&gt;Real-time multiplayer synchronization&lt;/li&gt;
&lt;li&gt;Full inventory and stats persistence&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Godot Client:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Fully integrated with the entire stack&lt;/li&gt;
&lt;li&gt;Complete UI with MMO-style panels&lt;/li&gt;
&lt;li&gt;Character creation with class selection&lt;/li&gt;
&lt;li&gt;Multiple polished scenes&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;I was crushing it. Architecture? Check. Data flow? Nailed it. Scalability? Ready for millions of players that would definitely (never) come.&lt;/p&gt;

&lt;p&gt;Here's some posts where I talked about progress:&lt;br&gt;
&lt;iframe class="tweet-embed" id="tweet-1954976218299895986-866" src="https://platform.twitter.com/embed/Tweet.html?id=1954976218299895986"&gt;
&lt;/iframe&gt;

  // Detect dark theme
  var iframe = document.getElementById('tweet-1954976218299895986-866');
  if (document.body.className.includes('dark-theme')) {
    iframe.src = "https://platform.twitter.com/embed/Tweet.html?id=1954976218299895986&amp;amp;theme=dark"
  }



&lt;br&gt;
&lt;iframe class="tweet-embed" id="tweet-1953539709730205787-148" src="https://platform.twitter.com/embed/Tweet.html?id=1953539709730205787"&gt;
&lt;/iframe&gt;

  // Detect dark theme
  var iframe = document.getElementById('tweet-1953539709730205787-148');
  if (document.body.className.includes('dark-theme')) {
    iframe.src = "https://platform.twitter.com/embed/Tweet.html?id=1953539709730205787&amp;amp;theme=dark"
  }



&lt;br&gt;
&lt;iframe class="tweet-embed" id="tweet-1952172653894148553-46" src="https://platform.twitter.com/embed/Tweet.html?id=1952172653894148553"&gt;
&lt;/iframe&gt;

  // Detect dark theme
  var iframe = document.getElementById('tweet-1952172653894148553-46');
  if (document.body.className.includes('dark-theme')) {
    iframe.src = "https://platform.twitter.com/embed/Tweet.html?id=1952172653894148553&amp;amp;theme=dark"
  }



&lt;/p&gt;

&lt;h2&gt;
  
  
  The Brutal Realization
&lt;/h2&gt;

&lt;p&gt;Then I tried to implement combat.&lt;br&gt;
And NPCs.&lt;br&gt;
And enemy AI.&lt;br&gt;
And suddenly, it hit me like a wave attack from a boss I needed to design: &lt;strong&gt;I had no idea how to actually design game systems.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Twenty-two years of programming experience, and I was paralyzed by questions like:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Should enemies attack on a timer or use complex behavior trees?&lt;/li&gt;
&lt;li&gt;What percentage of loot should be rare vs common?&lt;/li&gt;
&lt;li&gt;How do you make death punishing but not ragequit inducing?&lt;/li&gt;
&lt;li&gt;Why does every design decision have 47 interdependent systems?&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;I knew HOW to make an enemy attack. I knew HOW to implement a loot table. Shit, I could build you a distributed loot service with Redis caching. But WHAT should that enemy's attack pattern teach the player? WHAT loot distribution keeps players engaged without breaking the economy? &lt;/p&gt;

&lt;p&gt;I was an architect and never built a house.&lt;/p&gt;

&lt;h2&gt;
  
  
  The YouTube Immersion Therapy
&lt;/h2&gt;

&lt;p&gt;When I started this journey a few months ago, my entire YouTube feed became game development content. I immersed myself in design philosophy while coding, listening to creators like:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;a href="https://www.youtube.com/@thomasbrush" rel="noopener noreferrer"&gt;Thomas Brush&lt;/a&gt; (indie success stories and reality checks)&lt;/li&gt;
&lt;li&gt;
&lt;a href="https://www.youtube.com/@JonasTyroller" rel="noopener noreferrer"&gt;Jonas Tyroller&lt;/a&gt; (the science of game feel)&lt;/li&gt;
&lt;li&gt;
&lt;a href="https://www.youtube.com/@Aarimous" rel="noopener noreferrer"&gt;Aarimous&lt;/a&gt; (roguelike design deep dives)&lt;/li&gt;
&lt;li&gt;
&lt;a href="https://www.youtube.com/@JackieCodes" rel="noopener noreferrer"&gt;Jackie Codes&lt;/a&gt; (Godot-specific wisdom)&lt;/li&gt;
&lt;li&gt;
&lt;a href="https://www.youtube.com/@DevWorm" rel="noopener noreferrer"&gt;DevWorm&lt;/a&gt; (practical indie dev insights)&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Not tutorials, mind you. Working with the Fireship YouTube channel has taught me that tutorial hell is real, and most developers just need concepts, not code-alongs, something he does a great job at. I needed to understand how game designers THINK, not how they type.&lt;/p&gt;

&lt;p&gt;Everyone kept saying the same damn thing: "Start small. Build Pong. Make a platformer."&lt;/p&gt;

&lt;p&gt;But telling a seasoned developer to make Pong is like telling Gordon Ramsay to make a ham sandwhich. Sure, I could do it, but what would I actually learn?&lt;/p&gt;

&lt;h2&gt;
  
  
  Dungeon Supply Co: My "Small" Game That's Actually Perfect
&lt;/h2&gt;

&lt;p&gt;Instead of abandoning everything like so many times in the past, I started designing a new game specifically to teach me what I didn't know: &lt;strong&gt;Dungeon Supply Co.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;The premise? &lt;br&gt;
We've all crawled our fair share of dungeons, right? We grind and grind for gear, pots, and food for hours before finally attempting the dungeon. How the hell do the dungeon NPCs always have everything that they need??&lt;br&gt;
You're enslaved by an asshole orc who forces you to run a factory that supplies dungeons with everything—swords for skeletons, potions for bosses, and yes, all those ceramic pots that heroes compulsively smash.&lt;/p&gt;

&lt;p&gt;It's automation meets subtle dark humor and a bit of irony.&lt;/p&gt;

&lt;p&gt;More importantly, it's designed to force me to learn:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;State Management&lt;/strong&gt;: Hundreds of items on conveyor belts without melting CPUs&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Game Feel&lt;/strong&gt;: Making automation satisfying (that sweet, sweet production line dopamine)&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Art Pipeline&lt;/strong&gt;: Expanding on &lt;a href="https://mwaayk.itch.io/16x16-automation-asset-pack" rel="noopener noreferrer"&gt;Mwaayk's excellent 16x16 automation pack&lt;/a&gt; with my own sprites&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Scope Control&lt;/strong&gt;: 4-8 week timeline, not 4-8 years of development hell&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Player Psychology&lt;/strong&gt;: What makes "just one more production line" addictive&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  Why This Actually Works
&lt;/h3&gt;

&lt;p&gt;Building an automation game teaches fundamental game development skills without the complexity of combat, multiplayer networking, or making sure your netcode doesn't let players phase through walls like interdimensional ghosts.&lt;/p&gt;

&lt;p&gt;The technical challenges are real (managing thousands of moving items at 60 FPS), but bounded. The design space is constrained but meaningful. Most importantly, it's a game I'd actually want to play while procrastinating on building my actual dream game.&lt;/p&gt;

&lt;h2&gt;
  
  
  The Developer's Paradox: Failing Up
&lt;/h2&gt;

&lt;p&gt;Here's what nobody tells you: As programmers, we're trained to build incrementally. We start with "Hello World," not "Let's rebuild Google from scratch." But the moment passion enters the equation, we immediately try to build our own GSuite replacement for enterprise customers.&lt;/p&gt;

&lt;p&gt;My MMORPG isn't dead. In fact, working on Dungeon Supply Co. has made me MORE excited about Thundoria, not less. Every system I implement teaches me something I'll need. Every optimization technique, every player feedback loop, every scene implementation, it's all training for the main event.&lt;/p&gt;

&lt;h2&gt;
  
  
  The Real Lesson: Your Dream Game Needs Practice Games
&lt;/h2&gt;

&lt;p&gt;If you're a developer sitting on your own "dream game" idea, here's my advice: &lt;strong&gt;Don't abandon it. Orbit it.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Build smaller games that teach you specific skills you'll need. Want to make an RPG? Build an inventory system game first. Dream of a shooter? Start with a wave defense game.&lt;br&gt;
Think of it as building your own curriculum where every assignment directly contributes to your final project, except nobody's grading you and you can drink while doing it.&lt;/p&gt;

&lt;h2&gt;
  
  
  Join Me on This Beautiful Disaster
&lt;/h2&gt;

&lt;p&gt;I'm documenting everything—the successes, failures, and the times I spent 6 hours debugging only to realize I spelled "strength" wrong. &lt;strong&gt;&lt;a href="https://thundoria.com" rel="noopener noreferrer"&gt;Thundoria&lt;/a&gt;&lt;/strong&gt; is still happening, and I'm trying to build it in public because apparently I'm a masochist.&lt;/p&gt;

&lt;p&gt;The game design is stupidly ambitious:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Roguelike extraction mechanics where you gamble progression like a degenerate&lt;/li&gt;
&lt;li&gt;Bullet-hell combat that scales from "tutorial grandmother" to "what the fuck is happening"
&lt;/li&gt;
&lt;li&gt;"Just one more floor" addiction that ruins friendships&lt;/li&gt;
&lt;li&gt;No pay-to-win BS, just honest "give me money for cosmetics" capitalism&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Meanwhile, Dungeon Supply Co. is teaching me how to actually deliver on that vision without having a complete mental breakdown.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Want to watch this slow-motion catastrophe?&lt;/strong&gt; &lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Sign up for development updates at &lt;strong&gt;&lt;a href="https://thundoria.com" rel="noopener noreferrer"&gt;thundoria.com&lt;/a&gt;&lt;/strong&gt;
&lt;/li&gt;
&lt;li&gt;Watch me learn game dev fundamentals the hardest way possible&lt;/li&gt;
&lt;li&gt;Get early access to both games (whenever the hell they're ready)&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  The Bottom Line
&lt;/h2&gt;

&lt;p&gt;Every game developer is right: don't build an MMO as your first game. But also, don't let your dreams die in a folder called "maybe_someday_projects_final_v2_actual_final."&lt;br&gt;
Instead, be strategic. Build towards your dream, not away from it. Learn in public. Fail spectacularly. And remember—even the creators of World of Warcraft probably started by spawning themselves max cash stacks in someone else's terrible code.&lt;/p&gt;

&lt;p&gt;Although... how can I expect you to listen to me? I didn't listen, and honestly, I don't really expect anyone else to either. I'm just a guy with a dream and a tendency to overcomplicate things.&lt;/p&gt;

&lt;p&gt;Now if you'll excuse me, I have some conveyor belts to optimize. These skeletons won't arm themselves, and my orc overlord is getting bitchy.&lt;/p&gt;




&lt;h3&gt;
  
  
  Links
&lt;/h3&gt;

&lt;p&gt;&lt;em&gt;Are you also building a game way above your skill level? Learning game development after years of "real" programming? Let's suffer together!&lt;/em&gt;&lt;br&gt;
Follow the journey at &lt;a href="https://thundoria.com" rel="noopener noreferrer"&gt;thundoria.com&lt;/a&gt; and let's fail upward as a community.&lt;/p&gt;

&lt;p&gt;I post about my progressions sometimes on &lt;a href="https://bsky.app/profile/patrity.com" rel="noopener noreferrer"&gt;Bluesky&lt;/a&gt; and &lt;a href="https://x.com/ThePatrity" rel="noopener noreferrer"&gt;X / Twitter&lt;/a&gt; as well.&lt;/p&gt;




</description>
      <category>webdev</category>
      <category>programming</category>
      <category>gamedev</category>
      <category>architecture</category>
    </item>
    <item>
      <title>I Let Amazon's AI Build My Game for 3 Days. Here's What Happened</title>
      <dc:creator>Tony Costanzo</dc:creator>
      <pubDate>Tue, 17 Jun 2025 17:08:56 +0000</pubDate>
      <link>https://dev.to/patrity/i-let-amazons-ai-build-my-game-for-3-days-heres-what-happened-160j</link>
      <guid>https://dev.to/patrity/i-let-amazons-ai-build-my-game-for-3-days-heres-what-happened-160j</guid>
      <description>&lt;p&gt;&lt;em&gt;Originally published at &lt;a href="https://techhivelabs.net/blog/q-roguelike" rel="noopener noreferrer"&gt;techhivelabs.net&lt;/a&gt;&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;TL;DR&lt;/strong&gt;: Built a working roguelike with Amazon Q in hours. It was amazing until it wasn't. Enemy projectiles broke me. AI coding is powerful but not ready to fly solo yet.&lt;/p&gt;

&lt;p&gt;🎮 &lt;a href="https://q-rogue.nuxt.dev" rel="noopener noreferrer"&gt;Try the Game&lt;/a&gt; | 💻 &lt;a href="https://github.com/patrity/q-rogue" rel="noopener noreferrer"&gt;GitHub Repo&lt;/a&gt;&lt;/p&gt;




&lt;h2&gt;
  
  
  The Setup
&lt;/h2&gt;

&lt;p&gt;When Amazon threw down the gauntlet with their AI coding challenge, I couldn't resist. The mission? Build a browser-based game using their new AI assistant, Q. As someone who's been curious about the current state of AI-powered development, this seemed like the perfect opportunity to push the boundaries and see just how far we could go with "vibe coding" - that magical state where you describe what you want and the AI makes it happen.&lt;/p&gt;

&lt;p&gt;My weapon of choice? A fresh Nuxt.js project, my go-to framework for web development. I fired up Tabby and was pleasantly surprised to see Q integrate seamlessly with it - I'd half expected it to only work with the built-in terminal. While I noticed Q only offered Claude models (no complaints there, it's my LLM of choice anyway), I was ready to embark on this adventure.&lt;/p&gt;

&lt;h2&gt;
  
  
  First Contact: Setting Expectations
&lt;/h2&gt;

&lt;p&gt;I started by spitballing a rough idea for a roguelike game:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F6pdoe097cocr4yvvoykb.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F6pdoe097cocr4yvvoykb.png" width="800" height="485"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;The initial response was... well, exactly what you'd expect from an eager AI assistant - way too affirmative. I don't need a yes-man; I need honest feedback and alternative suggestions!&lt;/p&gt;

&lt;p&gt;After some gentle encouragement (okay, I may have talked some shit to the LLM), I finally got the honest feedback I was looking for. Be careful what you wish for, though - the reality check was humbling!&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F9esn4b0uwk85b4khdp94.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F9esn4b0uwk85b4khdp94.png" width="800" height="383"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Finding the Perfect Assets
&lt;/h2&gt;

&lt;p&gt;Before diving deeper, I needed some visual assets. I stumbled upon an absolutely gorgeous asset pack on &lt;a href="https://trevor-pupkin.itch.io/tech-dungeon-roguelite" rel="noopener noreferrer"&gt;itch.io by Trevor Pupkin&lt;/a&gt; - affordable, high-quality, and perfect for the cyberpunk roguelike vibe I was going for. I dropped it in the root directory and asked Q for its honest opinion about our game design and timeline.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Okay check out the asset pack in q-roguelike/TechDungeonAssets I really like this and think we could build a simple roguelike.. We can just do projectile combat, no building.. we can have upgrades like speed, multi projectile (adds +1 at a slight angle each time), health, fire speed, exploding bullets, etc.. We can keep it simple enough I suppose. What do you think about game engine with this design? is it doable in our timeframe? again dont just reaffirm, give honest feedback
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F656m2ucrgumcj0xq6ppz.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F656m2ucrgumcj0xq6ppz.png" width="800" height="621"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Q suggested we should just yeet a 2d canvas and start building on that. I was certainly hesitant about that considering all of the helpers libraries like Phaser or PixiJS gives us..&lt;br&gt;
&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Frpv1njy92hsanp89k57e.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Frpv1njy92hsanp89k57e.png" width="800" height="423"&gt;&lt;/a&gt;&lt;/p&gt;
&lt;h2&gt;
  
  
  The First Attempt: A Comedy of Errors
&lt;/h2&gt;

&lt;p&gt;The "actual" first attempt was... let's call it educational. The code was non-functioning, mixing Vue 2 Options API inside a Vue 3 Composition API script block. But hey, I was being intentionally vague with my requirements, so I can't blame Claude or Q entirely. One prompt later pointing out the issue, and we had our first error-free pass.&lt;/p&gt;

&lt;p&gt;Well... it was &lt;em&gt;something&lt;/em&gt;:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fg5b7ed5vklfms93kity4.gif" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fg5b7ed5vklfms93kity4.gif" width="800" height="639"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;I'm still not entirely sure what I was looking at, but asking an LLM to parse multiple spritesheets and properly set up sprites with animations is admittedly a tall order.&lt;/p&gt;

&lt;p&gt;Before diving into fixing the sprite issues, I noticed Q had done something quite thoughtful - it had taken all the assets I'd dumped in the root directory and organized them nicely in the public folder. Small wins!&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Ftxbaspac6otgxpztb6tw.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Ftxbaspac6otgxpztb6tw.png" width="241" height="688"&gt;&lt;/a&gt;&lt;/p&gt;
&lt;h2&gt;
  
  
  The TexturePacker Breakthrough
&lt;/h2&gt;

&lt;p&gt;Then I thought of a way to give more image context.. the TexturePacker app outputs JSON data alongside its spritesheets. If I gave each image and animation a descriptive name, Q should be able to parse and use them correctly... right?&lt;/p&gt;

&lt;p&gt;RIGHT!&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fknlhv4cvk94vgo84omo4.gif" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fknlhv4cvk94vgo84omo4.gif" width="799" height="605"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Suddenly, we had a working run animation and projectiles firing in the direction of my mouse! Sure, my character wasn't facing the right direction and the projectiles were angled incorrectly, but this was genuine progress. This was the point where I thought I'd need to take over completely, but I was curious to see how far Q could go.&lt;/p&gt;
&lt;h2&gt;
  
  
  Building the Core Game Loop
&lt;/h2&gt;

&lt;p&gt;Instead of getting bogged down in perfectionism, I asked Q to outline the next steps:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Foy5nk0k12yoe9pscng3f.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Foy5nk0k12yoe9pscng3f.png" width="800" height="330"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Q provided a solid roadmap:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight markdown"&gt;&lt;code&gt;&lt;span class="gu"&gt;## Priority Order:&lt;/span&gt;
&lt;span class="p"&gt;
1.&lt;/span&gt; Collision &amp;amp; Combat System
• Projectile-enemy collision detection
• Enemy health and death
• Basic enemy AI (move toward player)
&lt;span class="p"&gt;
2.&lt;/span&gt; Wave System
• Spawn enemies in waves
• Wave progression with increasing difficulty
• Wave completion detection
&lt;span class="p"&gt;
3.&lt;/span&gt; Roguelike Upgrades
• Upgrade selection screen between waves
• Core upgrades: damage, fire rate, health, speed, multi-shot
• Persistent upgrade effects
&lt;span class="p"&gt;
4.&lt;/span&gt; Game State Management
• Health system for player
• Game over/restart
• Score tracking
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Implementing Combat
&lt;/h3&gt;

&lt;p&gt;Starting with collision and combat systems, I prompted: &lt;code&gt;Okay let's go in order! We can go ahead and implement the projectile hits, enemies chasing, health system, and death animations!&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;The first attempt introduced some bugs - I couldn't shoot and spawned with 0 HP. By the time I died, my health was between -5 and -10. Classic game development!&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fp2trjrzt4oqrh4mt5e7e.gif" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fp2trjrzt4oqrh4mt5e7e.gif" width="760" height="591"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;One clarifying prompt later: &lt;code&gt;I'm ready to move on but we do have some issues. I'm not able to shoot but I think it may be because I spawn with 0hp and by the time I die, my hp is -5 - -10.. I think we need some delay between death and restarting so that the death animation can play as well. Finally I see a lot of warnings in the console from the animation manager stating that our animation keys already exist.. Are we reinitializing these unnecessarily?&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;And just like that, we had a functioning combat system! Complete with health management, incremental damage, immunity periods, and even a score system:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fwd3umph0uviwwyd77jfz.gif" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fwd3umph0uviwwyd77jfz.gif" width="760" height="626"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  Code Quality Check
&lt;/h3&gt;

&lt;p&gt;At this point, I hadn't really examined the code beyond fixing that initial Vue 2/3 issue. I was expecting a thousand lines of spaghetti. To my surprise, we had only ~450 lines of surprisingly clean code. All in a single component (not ideal, but workable), including ~20 lines of CSS and 10 lines of templating. The JavaScript was well-structured, without duplicated logic, and documented concisely - not in that typical verbose AI fashion. Color me impressed!&lt;/p&gt;

&lt;h3&gt;
  
  
  The Wave System
&lt;/h3&gt;

&lt;p&gt;Next up: the wave system. One prompt. Just one prompt, and boom:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fmhocdanykde7zhs77v4r.gif" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fmhocdanykde7zhs77v4r.gif" width="800" height="649"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;I was genuinely impressed at this point. We had a working wave system with progressive difficulty in a single iteration.&lt;/p&gt;

&lt;h2&gt;
  
  
  Hitting the Wall: Context Limits and Collision Detection
&lt;/h2&gt;

&lt;p&gt;The next challenge - implementing the upgrade system and tilemap collision - is where things got rocky. Q struggled. Hard. My codebase ballooned from ~500 lines to about 1,000 lines. Despite having all the tilemap data in JSON format, Q couldn't get the collision layers working properly.&lt;/p&gt;

&lt;p&gt;It loaded the map and registered all the layers correctly, but when it came to setting up collision detection, we went in circles. Q eventually decided that Phaser's built-in collision system was broken (spoiler: it wasn't) and attempted to write its own per-tile collision system. Yikes.&lt;/p&gt;

&lt;p&gt;I tried to guide it back to using Phaser's built-in features, but we'd hit the classic AI coding limitation: context window exhaustion. Under 1,000 lines of code and we were already having fundamental issues. Q started creating basic TypeScript errors that prevented the page from running entirely.&lt;/p&gt;

&lt;p&gt;Recognizing the signs, I asked Q to strip out all the collision work so I could handle it myself. I created a git commit (should have done this earlier!) and prompted Q to create documentation to maintain high-level context.&lt;/p&gt;

&lt;h2&gt;
  
  
  Taking Back Control
&lt;/h2&gt;

&lt;p&gt;I performed a major refactor, splitting the monolithic component into separate TypeScript files and Phaser scenes. With the help of &lt;a href="https://www.youtube.com/@ourcadetv" rel="noopener noreferrer"&gt;Ourcade TV's&lt;/a&gt; excellent YouTube tutorials, I implemented proper collision detection myself.&lt;/p&gt;

&lt;p&gt;This created a new problem: the basic straight-line enemy AI couldn't navigate around walls. Time to see how Q handled pathfinding:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Ft167jq30jkul940aud6n.gif" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Ft167jq30jkul940aud6n.gif" width="760" height="576"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Well... the enemies were certainly moving, just not in any useful direction. When I clarified that I needed proper pathfinding, Q implemented A* pathfinding with heuristic functions for 8-directional movement. The first attempt was too precise, causing enemies to overshoot waypoints and backtrack:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fvf2d9j3cnf69mv361i0s.gif" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fvf2d9j3cnf69mv361i0s.gif" width="454" height="276"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;But third time's the charm! In just three prompts, Q had implemented fairly sophisticated pathfinding:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fjzty1li5qn8if3y69t7h.gif" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fjzty1li5qn8if3y69t7h.gif" width="720" height="539"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Pushing Forward and Finding the Limits
&lt;/h2&gt;

&lt;p&gt;At this point, we'd essentially completed the original goal, but I was feeling inspired. I've had this concept for a browser-based MMO/roguelike hybrid brewing for a while, and this seemed like the perfect opportunity to explore it further.&lt;/p&gt;

&lt;p&gt;I took more control from here, using Q as a coding assistant rather than the primary developer. We added more enemy types, complex wave patterns, tiered upgrades, and other roguelike elements. But the final straw? Enemy projectiles.&lt;/p&gt;

&lt;p&gt;Getting enemy projectiles to move correctly, deal damage, and not freeze the entire game took over 10 prompts. I never successfully got Q to implement this feature without game-breaking bugs.&lt;/p&gt;

&lt;h2&gt;
  
  
  The Verdict: Impressive but Not Ready for Prime Time
&lt;/h2&gt;

&lt;p&gt;Let me be clear: I was genuinely impressed with how quickly Q created a functioning game that felt like a real project worth iterating on. The initial results had me excited about the possibilities of AI-assisted development.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;But here's the bottom line:&lt;/strong&gt; I ended up with a pile of unfamiliar, difficult-to-maintain code with a clunky development pattern that I didn't want to continue building on.&lt;/p&gt;

&lt;p&gt;As a reasonably experienced developer, I had to guide Q toward correct solutions fairly early in the process. I'm not confident that less experienced developers would be able to provide the same guidance when things go sideways.&lt;/p&gt;

&lt;p&gt;This isn't really a criticism of Q specifically - it's more about the current state of AI coding assistants in general. Language models will undoubtedly improve, but will we ever be able to go completely hands-free on larger projects? I doubt it. Context windows need to expand dramatically, and tools like Q need more sophisticated agentic processes to prevent the accumulation of "AI slop."&lt;/p&gt;

&lt;h2&gt;
  
  
  Final Thoughts
&lt;/h2&gt;

&lt;p&gt;I'm glad Amazon put this challenge out there. It gave me a valuable opportunity to assess the current state of AI coding assistants in a real-world scenario. The technology is impressive and shows tremendous promise, but for now, I'll stick with using LLMs through web interfaces and copilot-style IDE extensions for specific tasks rather than full project development.&lt;/p&gt;

&lt;p&gt;I'm not quite ready to hand over the reins completely - but I'm excited to see where this technology goes. The future of AI-assisted development is bright, even if we're not quite there yet. Who knows? Maybe in a year or two, I'll be writing a follow-up post about how I built an entire MMO using just voice commands and interpretive dance.&lt;/p&gt;

&lt;p&gt;Until then, happy coding - whether you're doing it with AI assistance or good old-fashioned keyboard mashing!&lt;/p&gt;

</description>
      <category>programming</category>
      <category>gamedev</category>
      <category>ai</category>
      <category>webdev</category>
    </item>
  </channel>
</rss>
