<?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: Steve Aragón</title>
    <description>The latest articles on DEV Community by Steve Aragón (@stevearagonsite).</description>
    <link>https://dev.to/stevearagonsite</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%2F1580013%2Ffc0a3b5a-bbdd-4dd9-8e66-1defcb6718d5.jpg</url>
      <title>DEV Community: Steve Aragón</title>
      <link>https://dev.to/stevearagonsite</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/stevearagonsite"/>
    <language>en</language>
    <item>
      <title>Discord Game Architecture!</title>
      <dc:creator>Steve Aragón</dc:creator>
      <pubDate>Wed, 14 Oct 2026 01:39:44 +0000</pubDate>
      <link>https://dev.to/stevearagonsite/my-first-discord-game-3-2phl</link>
      <guid>https://dev.to/stevearagonsite/my-first-discord-game-3-2phl</guid>
      <description>&lt;p&gt;I was working on a new integration with &lt;strong&gt;Discord&lt;/strong&gt;. However, I didn't understand how to implement a multiplayer system with Godot as the client and a Node server because, as far as I knew, you had to pay for a server on AWS or switch engines (Colyseus or Photon). Then I used &lt;strong&gt;Claude Code&lt;/strong&gt; and &lt;strong&gt;Cloudflare&lt;/strong&gt; to build a &lt;strong&gt;multiplayer server&lt;/strong&gt; with Workers and Pages. Everything about this service was new to me, and it was incredible: it solved all my problems with serving my app to users on Discord.&lt;/p&gt;

&lt;p&gt;I tried a new architecture with &lt;strong&gt;Cloudflare&lt;/strong&gt;: a single Worker serves both the game bundles and the server, with everything ready for rooms, players, settings, and so on.&lt;/p&gt;

&lt;p&gt;The new architecture was overwhelming, but it let me build a new feature: persistent user progress. Then I combined it with &lt;strong&gt;Supabase&lt;/strong&gt; to add &lt;strong&gt;SSO and a database&lt;/strong&gt; for user badges and more.&lt;/p&gt;

&lt;p&gt;The game is called &lt;strong&gt;Se Pudrió Todo&lt;/strong&gt;: a party card game set in Argentina. Every round, one player is the judge, everyone else plays their funniest answer, and the table can throw red and yellow cards like in a football match. It runs as a &lt;strong&gt;Discord Activity&lt;/strong&gt;, so you play it inside a voice call with your friends, and it also works in any browser.&lt;/p&gt;

&lt;h2&gt;
  
  
  The architecture
&lt;/h2&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%2Fexm4nag33h4ubgjqv0le.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%2Fexm4nag33h4ubgjqv0le.png" alt="Architecture diagram: players open the Activity in Discord, the Godot web client connects through the discordsays.com proxy to a Cloudflare Worker, which serves the game files and routes each room to a Durable Object with its rules engine and SQLite; Supabase Auth and Postgres store optional accounts, progress and badges" width="799" height="469"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://diagrams.stevearagonsite.com/se-pudrio-todo/infra.html" rel="noopener noreferrer"&gt;https://diagrams.stevearagonsite.com/se-pudrio-todo/infra.html&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;The whole idea fits in five lines:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;The Godot client is only a view.&lt;/strong&gt; It sends commands ("play this card", "vote") and draws whatever state the server sends back. No rules live in the client.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;One Worker serves everything:&lt;/strong&gt; the game files, the API and the WebSocket. One deploy, one address.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;One Durable Object per room is the authoritative server.&lt;/strong&gt; The rules engine is pure TypeScript (state + command → new state), the room keeps its own SQLite, and alarms handle the timers.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Each player gets a filtered snapshot.&lt;/strong&gt; A card game has hidden information, so the server decides what each player can see: nobody gets another player's hand.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Inside Discord, everything goes through the &lt;code&gt;discordsays.com&lt;/code&gt; proxy,&lt;/strong&gt; and WebSocket is the only real-time option. That one rule shaped the whole design.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Why not a regular game server
&lt;/h2&gt;

&lt;p&gt;Colyseus, Photon or a Node server on AWS all mean a machine running 24/7 that I have to pay for and maintain. A Durable Object is already a room: it's isolated, it keeps its state, and it hibernates when nobody is playing. I didn't have to switch engines or rent a server. I just had to stop thinking of "the server" as one big process.&lt;/p&gt;

&lt;h2&gt;
  
  
  Fitting Godot into a Worker
&lt;/h2&gt;

&lt;p&gt;The Godot web export was bigger than the file size limit for Worker static assets. The fix was simple: I upload the build only compressed (Brotli and gzip), name each file by its hash, and the Worker sends the version the browser accepts with a one-year cache. A deploy that only changes GDScript only changes the game pack, so players don't download the engine again.&lt;/p&gt;

&lt;h2&gt;
  
  
  Accounts with Supabase
&lt;/h2&gt;

&lt;p&gt;Accounts are optional: you never need one to play. When you sign in (Google or Discord), the Worker only notes which account the game belongs to. The client never touches the database: only the Worker talks to Supabase, with a secret key, through database functions. When a game ends, the room sends the result, and Supabase stores your progress, badges and favorite cards. I designed the schema for several games from day one, because this won't be my last one.&lt;/p&gt;

&lt;h2&gt;
  
  
  How it came together, day by day
&lt;/h2&gt;

&lt;p&gt;I looked at the git history to see the order in which each tool came in. It all happened in one week, and during the first three days I also played about five games with friends:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Day 1:&lt;/strong&gt; the Godot project automated from the terminal, the game rules, research on Discord Activities and the architecture decision. Then the rules engine on a Durable Object, the Worker serving the web build, the Discord Activity with a tunnel for local testing, and the first deploy. By the end of the day, people could also play in the browser as signed guests, and the game was on itch.io. That night, the first game with friends.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Day 2:&lt;/strong&gt; fixes from my friends' feedback (more below), Discord on phones (real screen sizes, safe areas and the tiny picture-in-picture view), and the deck moved to a Google Sheet.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Day 3:&lt;/strong&gt; Jev scored every card pair, and I trimmed the deck to the best ones. Then bots that live in the room, invitation previews and rematches. Discord avatars, Rich Presence and invites. And &lt;strong&gt;Supabase&lt;/strong&gt;: accounts, badges, a profile and sign-in with Google or Discord.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Day 4:&lt;/strong&gt; security (rate limits, Turnstile, a Content Security Policy), rooms that survive a deploy, automatic reconnection, faster loading with a service worker, and a landing page.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Day 5:&lt;/strong&gt; infrastructure as code with Terraform, public rooms, an all-ages Discord app for the App Directory, and error tracking.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Day 6:&lt;/strong&gt; the whole game in English.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Five games with friends
&lt;/h2&gt;

&lt;p&gt;Before polishing anything, I wanted to know if the idea was fun. During the first three days, I played about five games with friends, and every game ended with their opinions. Each comment went straight into the backlog, and most were fixed before the next game:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;The play button was far from the table, in the bottom-left corner. Now it shows up in the middle, where your eyes already are.&lt;/li&gt;
&lt;li&gt;The judge wanted to flip any face-down answer, not always in order.&lt;/li&gt;
&lt;li&gt;The shuffle "felt bad": cards you had just thrown away came back right away. Now the deck avoids repeats.&lt;/li&gt;
&lt;li&gt;The cards needed more motion: dealing, flipping and picking.&lt;/li&gt;
&lt;li&gt;Some friends wanted to play with the keyboard only.&lt;/li&gt;
&lt;li&gt;With three players, voting on a red card made no sense, so the red card started removing the answer directly.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Real people found things that no automated test would catch.&lt;/p&gt;

&lt;h2&gt;
  
  
  Balancing the deck: a Google Sheet and Jev
&lt;/h2&gt;

&lt;p&gt;A card game lives or dies by its cards, so I needed a way to edit hundreds of them without touching JSON. All the cards live in a Google Sheet, and a script syncs it with the game in both directions, so the sheet is always the source of truth. Each card has a theme and an "In the game" checkbox, and a Balance tab compares the deck with its targets: 35% Argentina, 25% vices and partying, 20% dark humor and 20% adult jokes.&lt;/p&gt;

&lt;p&gt;To score the cards, I used &lt;strong&gt;Jev&lt;/strong&gt;, TypeSafe's System One model, through OpenRouter. Jev crosses every black card with every white card and rates each pair on four axes: does it make sense, is it funny, does it feel Argentine, and is it witty? Each card gets the average of its pairs, and the final score (MIX) counts wit and Argentine flavor twice. Then a script keeps the best cards of each theme in the game.&lt;/p&gt;

&lt;p&gt;The last word is still mine: when I mark a card as "Updated", no script changes its score or whether it's in the game.&lt;/p&gt;

&lt;h2&gt;
  
  
  The lesson
&lt;/h2&gt;

&lt;p&gt;The hard part wasn't the code. It was deciding &lt;strong&gt;where the rules live&lt;/strong&gt;. Once that was clear (the server is the truth and the client is a view), and once I wrote it down as an architecture decision, vibe coding with Claude Code moved fast, because every new feature had an obvious place to go. And play it with real people as soon as you can: five games with friends taught me more than any test.&lt;/p&gt;

&lt;p&gt;So if you think multiplayer means paying for a server or switching engines, look at edge platforms first. A Durable Object per room was all my game needed.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Play it:&lt;/strong&gt; &lt;a href="https://se-pudrio-todo.stevearagonsite.com/en" rel="noopener noreferrer"&gt;https://se-pudrio-todo.stevearagonsite.com/en&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Join the Discord server:&lt;/strong&gt; &lt;a href="https://discord.gg/UudNQzBAkw" rel="noopener noreferrer"&gt;https://discord.gg/UudNQzBAkw&lt;/a&gt;&lt;/p&gt;

</description>
      <category>ai</category>
      <category>devops</category>
      <category>architecture</category>
      <category>gamedev</category>
    </item>
    <item>
      <title>Experience Working with OpenClaw (Clawbot)</title>
      <dc:creator>Steve Aragón</dc:creator>
      <pubDate>Wed, 18 Mar 2026 18:58:24 +0000</pubDate>
      <link>https://dev.to/stevearagonsite/experience-working-with-openclaw-clawbot-298g</link>
      <guid>https://dev.to/stevearagonsite/experience-working-with-openclaw-clawbot-298g</guid>
      <description>&lt;h1&gt;
  
  
  Experience Working with OpenClaw (Clawbot)
&lt;/h1&gt;

&lt;p&gt;I want to share my experience as a developer working with OpenClaw (Clawbot), including a real-world setup and some practical insights after using it in production-like scenarios.&lt;/p&gt;

&lt;p&gt;My setup is based on:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;AMD Ryzen 5 5600X&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;32GB RAM&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;RTX 3060 (LHR)&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;NVMe SSD storage&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Ubuntu Server (headless environment)&lt;/strong&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;I also experimented with multiple &lt;strong&gt;Ollama local models&lt;/strong&gt; as part of a fallback strategy, along with &lt;strong&gt;cloud models like Kimi 2.5&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;From a configuration standpoint, OpenClaw is a powerful and flexible system — but that flexibility comes at a cost.&lt;/p&gt;




&lt;h2&gt;
  
  
  Real Setup (Explained)
&lt;/h2&gt;

&lt;p&gt;Instead of showing raw configuration, here’s how my setup is structured conceptually:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Primary model:&lt;/strong&gt; Claude Opus 4.6
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Cloud alternative:&lt;/strong&gt; Kimi 2.5
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Fallback #1:&lt;/strong&gt; Local models via Ollama (GPU)
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Fallback #2:&lt;/strong&gt; OpenAI models
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Interface:&lt;/strong&gt; Telegram
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Remote access:&lt;/strong&gt; Tailscale as a service
&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Flow:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;Primary cloud model → Alternative cloud → Local fallback → Secondary cloud fallback&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;This setup aims to balance:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Performance&lt;/li&gt;
&lt;li&gt;Reliability&lt;/li&gt;
&lt;li&gt;Offline capability&lt;/li&gt;
&lt;/ul&gt;




&lt;h2&gt;
  
  
  Infrastructure &amp;amp; Tooling
&lt;/h2&gt;

&lt;h3&gt;
  
  
  Ubuntu Server
&lt;/h3&gt;

&lt;p&gt;I chose &lt;strong&gt;Ubuntu Server&lt;/strong&gt; to fully utilize the machine:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Lower overhead (no GUI)&lt;/li&gt;
&lt;li&gt;Better resource allocation for models&lt;/li&gt;
&lt;li&gt;More predictable performance for long-running processes&lt;/li&gt;
&lt;/ul&gt;




&lt;h3&gt;
  
  
  Tailscale (as a service)
&lt;/h3&gt;

&lt;p&gt;I used &lt;strong&gt;Tailscale&lt;/strong&gt; running as a background service to access the machine remotely.&lt;/p&gt;

&lt;p&gt;The experience was &lt;strong&gt;excellent&lt;/strong&gt;:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Fast and stable connections&lt;/li&gt;
&lt;li&gt;Zero-config networking&lt;/li&gt;
&lt;li&gt;Secure remote access without exposing ports&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;This made it extremely easy to:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Manage OpenClaw remotely&lt;/li&gt;
&lt;li&gt;Debug issues&lt;/li&gt;
&lt;li&gt;Interact with the system from anywhere&lt;/li&gt;
&lt;/ul&gt;




&lt;h3&gt;
  
  
  Claude Code for Setup
&lt;/h3&gt;

&lt;p&gt;I used &lt;strong&gt;Claude Code&lt;/strong&gt; to bootstrap and configure the environment.&lt;/p&gt;

&lt;p&gt;This significantly reduced setup friction:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Faster iteration&lt;/li&gt;
&lt;li&gt;Easier debugging&lt;/li&gt;
&lt;li&gt;Better guidance wiring models and fallbacks&lt;/li&gt;
&lt;/ul&gt;




&lt;h2&gt;
  
  
  Local Models Tested (Ollama)
&lt;/h2&gt;

&lt;p&gt;I tested several local models using Ollama:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Gemma 3 (12B)&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Qwen 3 (14B, abliterated)&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Qwen 3.5 (9B)&lt;/strong&gt;&lt;/li&gt;
&lt;/ul&gt;




&lt;h2&gt;
  
  
  Model Performance Ranking
&lt;/h2&gt;

&lt;h3&gt;
  
  
  🧠 Overall Ranking (Reasoning + Speed)
&lt;/h3&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;Kimi 2.5 (cloud)&lt;/strong&gt; → Best overall performance
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Gemma 3 (local)&lt;/strong&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Qwen 3 (local)&lt;/strong&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Qwen 3.5 (local)&lt;/strong&gt;
&lt;/li&gt;
&lt;/ol&gt;




&lt;h3&gt;
  
  
  ☁️ Provider Ranking
&lt;/h3&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;Anthropic (Claude models)&lt;/strong&gt; → Most reliable reasoning
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;OpenAI models&lt;/strong&gt; → Strong and consistent
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Ollama (local models)&lt;/strong&gt; → Significantly weaker
&lt;/li&gt;
&lt;/ol&gt;




&lt;h2&gt;
  
  
  My Experience with Local Models
&lt;/h2&gt;

&lt;p&gt;Using &lt;strong&gt;Ollama with local models&lt;/strong&gt; is a great idea in theory.&lt;/p&gt;

&lt;h3&gt;
  
  
  Pros:
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;Works without internet&lt;/li&gt;
&lt;li&gt;Fully local&lt;/li&gt;
&lt;li&gt;Good fallback strategy&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  Reality:
&lt;/h3&gt;

&lt;p&gt;Even running on an RTX 3060 and testing multiple models:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;Local models were, in practice, a &lt;strong&gt;major downgrade&lt;/strong&gt;.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;It almost feels like the system gets “lobotomized” when switching to them:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Weak reasoning&lt;/li&gt;
&lt;li&gt;Poor context handling&lt;/li&gt;
&lt;li&gt;Inconsistent outputs&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;This becomes very clear when compared to:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Claude (Anthropic)&lt;/li&gt;
&lt;li&gt;OpenAI models&lt;/li&gt;
&lt;li&gt;Kimi 2.5 (which performed surprisingly well)&lt;/li&gt;
&lt;/ul&gt;




&lt;h2&gt;
  
  
  Key Challenges
&lt;/h2&gt;

&lt;h3&gt;
  
  
  1. Opacity in the TUI
&lt;/h3&gt;

&lt;p&gt;The TUI feels like a black box.&lt;/p&gt;

&lt;p&gt;You don’t know:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Which model is active&lt;/li&gt;
&lt;li&gt;When fallbacks trigger&lt;/li&gt;
&lt;li&gt;Why decisions are made&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;This makes debugging painful.&lt;/p&gt;




&lt;h3&gt;
  
  
  2. Lack of Cross-Channel Consistency
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;Telegram ≠ TUI&lt;/li&gt;
&lt;li&gt;No shared continuity&lt;/li&gt;
&lt;li&gt;Fragmented sessions&lt;/li&gt;
&lt;/ul&gt;




&lt;h3&gt;
  
  
  3. Configuration Complexity
&lt;/h3&gt;

&lt;p&gt;You must carefully align:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Models&lt;/li&gt;
&lt;li&gt;Providers&lt;/li&gt;
&lt;li&gt;Fallbacks&lt;/li&gt;
&lt;li&gt;Channels&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Otherwise:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Silent failures&lt;/li&gt;
&lt;li&gt;Weird behaviors&lt;/li&gt;
&lt;li&gt;Hard-to-debug issues&lt;/li&gt;
&lt;/ul&gt;




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

&lt;p&gt;OpenClaw has a &lt;strong&gt;strong architectural foundation&lt;/strong&gt;:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Multi-model orchestration&lt;/li&gt;
&lt;li&gt;Fallback strategies&lt;/li&gt;
&lt;li&gt;Multi-channel interaction&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;But it needs improvements in:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Transparency (TUI)&lt;/li&gt;
&lt;li&gt;Cross-channel consistency&lt;/li&gt;
&lt;li&gt;Developer experience&lt;/li&gt;
&lt;li&gt;Local model performance&lt;/li&gt;
&lt;/ul&gt;




&lt;h2&gt;
  
  
  Conclusion
&lt;/h2&gt;

&lt;p&gt;Combining:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Ubuntu Server&lt;/li&gt;
&lt;li&gt;Tailscale&lt;/li&gt;
&lt;li&gt;Cloud + local models&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;creates a &lt;strong&gt;very powerful personal AI infrastructure&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;However:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;Today, &lt;strong&gt;cloud models still massively outperform local ones&lt;/strong&gt;, even on decent hardware like an RTX 3060.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;The idea is solid.&lt;/p&gt;

&lt;p&gt;The execution is promising.&lt;/p&gt;

&lt;p&gt;But the ecosystem — especially around local models — still has a long way to go.&lt;/p&gt;

</description>
      <category>ai</category>
      <category>linux</category>
      <category>llm</category>
      <category>openclaw</category>
    </item>
  </channel>
</rss>
