<?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: WIlf Lin</title>
    <description>The latest articles on DEV Community by WIlf Lin (@wilf_lin).</description>
    <link>https://dev.to/wilf_lin</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%2F4211861%2F6214d570-088d-4142-add3-56b8a31526b2.jpg</url>
      <title>DEV Community: WIlf Lin</title>
      <link>https://dev.to/wilf_lin</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/wilf_lin"/>
    <language>en</language>
    <item>
      <title>Gitzilla: I Turned GitHub Repos into Monsters You Fight with Your Phone (with ~40 AI Agents and 20 Minutes of Sleep)</title>
      <dc:creator>WIlf Lin</dc:creator>
      <pubDate>Wed, 28 Oct 2026 01:07:16 +0000</pubDate>
      <link>https://dev.to/wilf_lin/gitzilla-i-turned-github-repos-into-monsters-you-fight-with-your-phone-with-40-ai-agents-and-20-56na</link>
      <guid>https://dev.to/wilf_lin/gitzilla-i-turned-github-repos-into-monsters-you-fight-with-your-phone-with-40-ai-agents-and-20-56na</guid>
      <description>&lt;p&gt;&lt;em&gt;This is a submission for the &lt;a href="https://dev.to/mlh-hackathon"&gt;MLH x DEV Writing Challenge&lt;/a&gt;&lt;/em&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  What I Built
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;Gitzilla&lt;/strong&gt; turns GitHub repositories into pixel-art monsters, and turns the phones in your pockets into motion controllers.&lt;/p&gt;

&lt;p&gt;One person opens a room on a big screen. Everyone else scans a QR code and plays from their phone's browser: no app, no gamepad. Tilt to move, flick to attack, swipe to dash, draw a circle in the air for your skill. Your repo is your fighter, and somebody else's repo is the boss.&lt;/p&gt;

&lt;p&gt;The monster isn't random. Its body &lt;em&gt;is&lt;/em&gt; the architecture:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;the &lt;strong&gt;heart&lt;/strong&gt; is the most-imported file (highest fan-in);&lt;/li&gt;
&lt;li&gt;the &lt;strong&gt;limbs&lt;/strong&gt; are the top components, weighted by lines of code, and breaking one removes the attacks it powers;&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;circular dependencies&lt;/strong&gt; (found with Tarjan's SCC algorithm) glow as weak points.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Gitzilla downloads a bounded tarball, parses imports across 9 languages in memory, and fixed rules turn those signals into stats. Flask, with 6,000+ days of history, becomes an ancient abyssal serpent with five limbs. Ripgrep is mostly Rust and spread across many modules, so it fights with a cannon and gets a Firewall skill.&lt;/p&gt;

&lt;p&gt;There are three modes:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Co-op Raid:&lt;/strong&gt; up to 8 players take down one boss. When it dies, the autopsy shows it as a git diff of the broken components, with links to real &lt;code&gt;good first issue&lt;/code&gt;s ("Adopt an Organ").&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;PvP Royale:&lt;/strong&gt; 2–8 players, no respawns, and a shrinking "garbage-collector" zone. You sign in with GitHub and fight as a repo you actually own or maintain. Last hero standing wins.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Classroom:&lt;/strong&gt; a teacher hosts up to 30 students working through nine beginner Python lessons in an in-browser editor. Every &lt;em&gt;improvement&lt;/em&gt; to a student's code damages a shared class boss. The projector never shows who's struggling, and the teacher gets a debrief of what to reteach and who needs help.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Flip a switch and the whole match re-renders in 3D, with every sprite rebuilt from voxels. In Safari on &lt;strong&gt;Apple Vision Pro&lt;/strong&gt;, WebXR puts the arena on your table, and your phone stays the controller.&lt;/p&gt;

&lt;h3&gt;
  
  
  How the idea evolved
&lt;/h3&gt;

&lt;p&gt;We came to HackPSU with a list of ideas. Then the &lt;strong&gt;Mystery Stack&lt;/strong&gt; was revealed (phone motion control, 4+ players, theme: &lt;em&gt;Rivalry&lt;/em&gt;), and we decided to go for it.&lt;/p&gt;

&lt;p&gt;One idea on our list was "Repo Kaiju": a developer fighting their own repo. To fit the Mystery Stack, we redesigned it around motion controls and made it a squad-vs-boss fight. Then we added a PvP battle royale, because rivalry is more fun when it's personal. A teammate wasn't sold on the name, so I asked Claude for a pile of alternatives, and we picked &lt;strong&gt;Gitzilla&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;After that, the project grew one track at a time:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Gemini&lt;/strong&gt; was already designing our monsters and heroes.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Nittany AI Challenge:&lt;/strong&gt; I wanted something with real social value, not just fun, so we built Classroom mode.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Vultr:&lt;/strong&gt; we moved the game server to the cloud.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Solana:&lt;/strong&gt; we added tamper-evident match records.&lt;/li&gt;
&lt;li&gt;We still had time left, so we asked how to make it cooler. The answer was &lt;strong&gt;WebXR and Vision Pro&lt;/strong&gt;.&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  How we built it: one Claude, ~40 agents
&lt;/h3&gt;

&lt;p&gt;This is the part I most want to share. The whole build ran inside &lt;strong&gt;herdr&lt;/strong&gt;, a terminal workspace for running many coding agents. I started one Claude Code session as the coordinator, and it spun up about &lt;strong&gt;40 other agents&lt;/strong&gt; inside herdr:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Claude&lt;/strong&gt; coordinated everything and wrote all the frontend. For visuals, I fed it screenshots of pixel-art games as references and told it to go full "visual maxxing."&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Codex&lt;/strong&gt;, which I ran in ultrafast mode the whole weekend, wrote the game logic, the algorithms and the backend.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;The first playable version took 40 minutes.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;The collaboration setup was just as important. All four of us SSH'd into &lt;strong&gt;one shared dev machine&lt;/strong&gt; and directed the agents from there. Nobody had to sync branches or ask "wait, which version are you on?". We also took over the meeting room TV and put herdr on it, so the whole room could watch dozens of agents working live: panes scrolling, tasks finishing, new ones spinning up. It doubled as our team dashboard and as entertainment for anyone walking past.&lt;/p&gt;

&lt;p&gt;That changed how our team worked. Whenever someone pitched a new feature, I'd say &lt;em&gt;"we... can build that,"&lt;/em&gt; hand it to the agents, and watch it land. Our bottleneck stopped being typing speed and became how fast we could come up with ideas, test them, and decide.&lt;/p&gt;

&lt;p&gt;Everything was verified, not vibed: Vitest for the simulation and contracts, and Playwright for end-to-end playtests with multiple simulated players. We also wrote an automated flash checker, so no frame breaks WCAG 2.3.1 photosensitivity limits.&lt;/p&gt;

&lt;h3&gt;
  
  
  The hardest part: making motion feel right
&lt;/h3&gt;

&lt;p&gt;The hardest problem wasn't the networking or the parsing. It was &lt;strong&gt;turning phone motion into the action you meant&lt;/strong&gt;. Here's what we kept fighting:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Intuitive:&lt;/strong&gt; the gestures had to feel natural without a manual. Tilt has to follow the screen in any orientation, on iPhones and iPads alike.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Separate:&lt;/strong&gt; gestures interfered with each other. A hard flick could also read as a tilt, and a dash could also read as a circle.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;No false triggers:&lt;/strong&gt; a player who's just laughing and waving their phone around shouldn't fire.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;No missed triggers:&lt;/strong&gt; a gesture that was clearly made sometimes didn't register.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Right direction:&lt;/strong&gt; some moves sometimes went the wrong way.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;There was no clever shortcut. We playtested like crazy, with four people swinging phones at a TV, reported every misfire back to the agents, and iterated. What came out: tilt to move, tap or flick to attack, swipe or tip past 50° to dash, and a circle (phone upright) for your skill. There's also a training flow that teaches each gesture, plus touch-only and seated fallbacks so nobody gets left out.&lt;/p&gt;

&lt;h3&gt;
  
  
  What I learned
&lt;/h3&gt;

&lt;p&gt;Honestly? This was the first time I realized I'm way more capable than I thought. With the right orchestration, one person directing a fleet of agents can ship what used to take a whole team a month. The skill that mattered most wasn't writing code. It was knowing what to build, breaking it into pieces, and refusing to accept "it works on my machine" until four real phones agreed.&lt;/p&gt;

&lt;h2&gt;
  
  
  Demo
&lt;/h2&gt;

&lt;p&gt;  &lt;iframe src="https://www.youtube.com/embed/ik9SB7KkV-c" width="710" height="399"&gt;
  &lt;/iframe&gt;
&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Play it:&lt;/strong&gt; &lt;a href="https://gitzilla.wilflin.me" rel="noopener noreferrer"&gt;https://gitzilla.wilflin.me&lt;/a&gt; (open &lt;code&gt;?screen=1&lt;/code&gt; on a big screen, then join from your phones)&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Guided demo deck:&lt;/strong&gt; &lt;a href="https://gitzilla.wilflin.me/demo" rel="noopener noreferrer"&gt;https://gitzilla.wilflin.me/demo&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Devpost:&lt;/strong&gt; &lt;a href="https://devpost.com/software/gitzilla" rel="noopener noreferrer"&gt;https://devpost.com/software/gitzilla&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Code:&lt;/strong&gt; &lt;a href="https://github.com/gfhdhytghd/Gitzilla" rel="noopener noreferrer"&gt;https://github.com/gfhdhytghd/Gitzilla&lt;/a&gt;
&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%2Fr1nyee1gj68hd58qf3n7.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%2Fr1nyee1gj68hd58qf3n7.png" alt="Lobby: everyone joins with their own repo" width="800" height="533"&gt;&lt;/a&gt;&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.us-east-2.amazonaws.com%2Fuploads%2Farticles%2F07dcmb2glfb5ifjfq8kb.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%2F07dcmb2glfb5ifjfq8kb.png" alt="Boss Raid on the big screen" width="800" height="533"&gt;&lt;/a&gt;&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.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fa3t42lnac17spfpq16sx.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%2Fa3t42lnac17spfpq16sx.png" alt="The autopsy: the dead boss as a git diff, plus good first issues" width="800" height="533"&gt;&lt;/a&gt;&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.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fz235wqa2o6sk7h4ji52o.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%2Fz235wqa2o6sk7h4ji52o.png" alt="PvP Royale inside the shrinking GC zone" width="800" height="533"&gt;&lt;/a&gt;&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.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fgyq6vbiq51kat4lbd2b9.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%2Fgyq6vbiq51kat4lbd2b9.png" alt="Classroom mode: the teacher view" width="800" height="533"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Partner Technologies
&lt;/h2&gt;

&lt;h3&gt;
  
  
  Gemini API: the art director, never the referee
&lt;/h3&gt;

&lt;p&gt;Gemini designs every monster and hero. For each public repo, we send it signals from the analysis, such as the repo's own identifiers, components and age. It returns &lt;strong&gt;schema-constrained JSON&lt;/strong&gt;: a name, an epithet, a palette, taunts, and attack and limb names. Flask became &lt;strong&gt;"WSGI-Ouroboros."&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;The key design decision: &lt;strong&gt;Gemini never sets combat stats or drives the boss AI.&lt;/strong&gt; Stats are deterministic and come from the code analysis, so the game stays fair and explainable, and Gemini makes it feel alive. Every response is validated locally before anything renders.&lt;/p&gt;

&lt;p&gt;Gemini worked really well for this, and structured output made it safe to plug straight into the game. Our one worry was rate limits during a live demo with a room full of people, so we built a fallback chain: &lt;strong&gt;Gemini → DeepSeek → deterministic designs&lt;/strong&gt;. The game never blocks on a model call.&lt;/p&gt;

&lt;p&gt;Gemini also narrated our pitch video, using Gemini TTS.&lt;/p&gt;

&lt;h3&gt;
  
  
  Auth0: GitHub sign-in that actually means something
&lt;/h3&gt;

&lt;p&gt;In a royale, "your repo vs. my repo" only matters if it's &lt;em&gt;really&lt;/em&gt; your repo. Farhan built the Auth0 integration:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;sign-in is GitHub-only, through an Auth0 GitHub social connection (OIDC + PKCE);&lt;/li&gt;
&lt;li&gt;the server fetches the GitHub identity token through the &lt;strong&gt;Auth0 Management API&lt;/strong&gt;, and that token &lt;strong&gt;never leaves our server&lt;/strong&gt;;&lt;/li&gt;
&lt;li&gt;the server uses it to check, through the GitHub API, that you own a non-fork repo or maintain a public one, and &lt;strong&gt;re-checks at match start&lt;/strong&gt;.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The same identity links your phone as the controller for your seat on a big screen or a Vision Pro. Farhan said the experience was really smooth: the GitHub connection plus the Management API gave us exactly the trust boundary we needed without building auth ourselves.&lt;/p&gt;

&lt;h3&gt;
  
  
  Vultr: from a tunnel to a real cloud
&lt;/h3&gt;

&lt;p&gt;At first, the backend ran on &lt;strong&gt;my personal laptop&lt;/strong&gt;, tunneled to my own server with nps/npc. That's fine for a demo, but fragile for a real event. So we moved the authoritative game server to a &lt;strong&gt;Vultr Cloud Compute&lt;/strong&gt; instance, where it handles rooms, the 30 Hz simulation, 20 Hz WebSocket snapshots, repo analysis, the classroom engine and receipt storage.&lt;/p&gt;

&lt;p&gt;My part was creating the account, adding credit and handing over an API key. Codex did the rest: a dedicated systemd service, Caddy for TLS, and a deploy script that ships immutable git revisions, backs up state, health-checks the fresh process and &lt;strong&gt;rolls back automatically&lt;/strong&gt; if anything's off.&lt;/p&gt;

&lt;p&gt;What I liked most is that Vultr is a compute platform that scales easily and on demand. We could start small and grow if Gitzilla takes off, at a price that's reasonable for a student project.&lt;/p&gt;

&lt;h3&gt;
  
  
  Solana: a leaderboard you can't quietly rewrite
&lt;/h3&gt;

&lt;p&gt;This was my &lt;strong&gt;first blockchain project ever&lt;/strong&gt;. Before this, I'd only used crypto, never built on it. Claude and Codex walked me through every step of the setup:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Signed receipts:&lt;/strong&gt; after an eligible royale, every player can download an &lt;strong&gt;Ed25519-signed match receipt&lt;/strong&gt;. No wallet is needed to play.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Optional anchoring:&lt;/strong&gt; sign one message with Phantom or Solflare, and Gitzilla sponsors a &lt;strong&gt;Solana devnet Memo transaction&lt;/strong&gt; carrying the receipt ID and a salted SHA-256 digest. No names, repos or code go on-chain.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;"⛓ Verified on Solana" leaderboard:&lt;/strong&gt; each snapshot is hashed into a &lt;strong&gt;Merkle tree&lt;/strong&gt;, and the root is anchored in a single devnet Memo. Each row has a verify button that checks its inclusion proof in your browser.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;To be precise about what this proves: it makes the server's recorded history &lt;strong&gt;tamper-evident&lt;/strong&gt;, so it can't be silently rewritten after anchoring. It doesn't prove fair gameplay.&lt;/p&gt;

&lt;p&gt;I was genuinely surprised that it just worked. Our first anchor &lt;a href="https://explorer.solana.com/tx/3878L2WVAYBM5qUndpuKxaDn1YW4G5HRJC2FZU1FMVK1VUxg2tXY1CBb3z8xhCuheUUnAr2pdM8SLidc2P9dz4Qz?cluster=devnet" rel="noopener noreferrer"&gt;finalized on devnet at slot 514,986,981&lt;/a&gt;, from a real two-player royale.&lt;/p&gt;

&lt;h2&gt;
  
  
  Hackathon Experience
&lt;/h2&gt;

&lt;p&gt;I attended &lt;strong&gt;HackPSU Fall 2026&lt;/strong&gt; at Penn State.&lt;/p&gt;

&lt;p&gt;Our team came together in a slightly roundabout way. &lt;strong&gt;Eva&lt;/strong&gt;, &lt;strong&gt;Farhan&lt;/strong&gt; and &lt;strong&gt;Nareh&lt;/strong&gt; had formed a team on Discord, and Eva, whom I'd met at OpenAI DevDay, invited me to join. We ended up with a pretty clean split:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;I did the main coding, which really meant directing the agents;&lt;/li&gt;
&lt;li&gt;Nareh owned the UI design and hand-drew the Gitzilla logo;&lt;/li&gt;
&lt;li&gt;Farhan built the Auth0 integration and polished details in Cursor;&lt;/li&gt;
&lt;li&gt;Eva ran everything else: organization, every piece of paperwork and our UX testing.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The weekend was strange in the best way. Because the agents shipped so fast, we had time a hackathon usually doesn't give you: we walked downtown &lt;strong&gt;twice for proper sit-down meals&lt;/strong&gt;, and we even &lt;strong&gt;watched &lt;em&gt;Harry Potter and the Goblet of Fire&lt;/em&gt; together&lt;/strong&gt;. The rest of the time we brainstormed, playtested, and swung our phones at a TV like maniacs. I slept for about &lt;strong&gt;20 minutes, face-down on the desk&lt;/strong&gt;. My agents didn't stop once. My teammates got a more civilized 2–4 hours.&lt;/p&gt;

&lt;p&gt;The moment I'll remember most came near the end, when I showed my teammates the Vision Pro build. Same match, now sitting on a real table, with the phone still in your hand as the controller. They thought it was absolutely insane.&lt;/p&gt;

&lt;p&gt;Gitzilla started as a joke about technical debt being a monster. By Sunday it had become a party game, a rivalry engine, a classroom tool and an XR demo. Your codebase is a monster. Come fight it. 🦖&lt;/p&gt;

</description>
      <category>mlhacks</category>
      <category>devchallenge</category>
      <category>gamedev</category>
      <category>webdev</category>
    </item>
  </channel>
</rss>
