<?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>Forem: Caleb Hunter</title>
    <description>The latest articles on Forem by Caleb Hunter (@hellocaleb).</description>
    <link>https://forem.com/hellocaleb</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.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F1382877%2F77288db0-c247-4041-8081-bb4592e83347.png</url>
      <title>Forem: Caleb Hunter</title>
      <link>https://forem.com/hellocaleb</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://forem.com/feed/hellocaleb"/>
    <language>en</language>
    <item>
      <title>I Use Google Drive as My Primary File System. Here's How I Got Claude Cowork to Play Nice With It.</title>
      <dc:creator>Caleb Hunter</dc:creator>
      <pubDate>Thu, 02 Apr 2026 20:46:11 +0000</pubDate>
      <link>https://forem.com/hellocaleb/i-use-google-drive-as-my-primary-file-system-heres-how-i-got-claude-cowork-to-play-nice-with-it-4f8l</link>
      <guid>https://forem.com/hellocaleb/i-use-google-drive-as-my-primary-file-system-heres-how-i-got-claude-cowork-to-play-nice-with-it-4f8l</guid>
      <description>&lt;p&gt;&lt;strong&gt;TL;DR:&lt;/strong&gt; If you use Google Drive for Desktop in streaming mode, Claude Cowork can't reliably access those files. Set your working folders to "Available offline" (mirrored), grant Cowork access to those specific folders, and everything works. Details below.&lt;/p&gt;




&lt;p&gt;I'm in the middle of going cloud-first with my file storage. The goal: use Google Drive as my primary document store, stream everything to my Mac via the Google Drive for Desktop app, and only mirror the folders I'm actively working in. Less local storage used, everything accessible from anywhere.&lt;/p&gt;

&lt;p&gt;Then I started setting up Claude Cowork's file system access, and hit a question that I couldn't find a clear answer to anywhere.&lt;/p&gt;

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

&lt;p&gt;If you're not familiar with Google Drive for Desktop on macOS, here's the short version: it mounts your entire Google Drive as a volume in Finder. It looks and behaves like a normal folder full of normal files. You can navigate it, open files, drag things around. It feels local.&lt;/p&gt;

&lt;p&gt;But it's not. By default, those files are &lt;strong&gt;streamed&lt;/strong&gt;. They exist in the cloud. What you see in Finder are essentially placeholders that get downloaded on demand when you open them.&lt;/p&gt;

&lt;p&gt;This matters when you introduce an AI tool that wants to read and write files on your machine.&lt;/p&gt;

&lt;h2&gt;
  
  
  The Question
&lt;/h2&gt;

&lt;p&gt;Claude Cowork (the desktop app's automation feature) has a file system access permission. You grant it access to specific folders, and it can read, create, and modify files in those folders directly. No uploading, no copy-pasting. It just works with whatever is on disk.&lt;/p&gt;

&lt;p&gt;So my question was straightforward: if I point Cowork at a folder that &lt;em&gt;looks&lt;/em&gt; local but is actually my streamed Google Drive, what happens? Can it read those files? Will it error out? Will it silently fail?&lt;/p&gt;

&lt;p&gt;This is different from Claude's Google Drive connector in chat, which works with cloud-native Google Docs and Sheets directly. Cowork's file system access is a different mechanism entirely. It sees files on disk, period.&lt;/p&gt;

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

&lt;p&gt;The core issue comes down to one distinction: &lt;strong&gt;streaming vs. mirroring&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;Google Drive for Desktop has two modes for how it handles your files:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Streaming&lt;/strong&gt; is the default. Files live in the cloud. Finder shows them, but the actual bytes only get pulled down when you (or an app) opens them. Until that happens, the file is basically a stub. It has a name and an icon, but there's nothing really there yet from a filesystem perspective.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Mirroring&lt;/strong&gt; means the files live both in the cloud and fully on your local disk. The bytes are always present. Changes sync both directions automatically.&lt;/p&gt;

&lt;p&gt;Cowork runs in an isolated environment and interacts with files through the folders you share with it. When it tries to open a file, it needs actual bytes on disk. A streamed placeholder that hasn't been downloaded yet? Cowork may not see it at all, or it may throw an error.&lt;/p&gt;

&lt;p&gt;So the answer to my question: &lt;strong&gt;streamed-only files are unreliable with Cowork. Mirrored files work perfectly.&lt;/strong&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  The File Format Gotcha
&lt;/h2&gt;

&lt;p&gt;There's a second thing worth knowing.&lt;/p&gt;

&lt;p&gt;In Claude chat with the Google Drive connector, you can work directly with native Google Docs, Sheets, and Slides. Those are cloud-native formats that the connector understands.&lt;/p&gt;

&lt;p&gt;Cowork's file system access is different. It works with actual files: &lt;code&gt;.docx&lt;/code&gt;, &lt;code&gt;.txt&lt;/code&gt;, &lt;code&gt;.md&lt;/code&gt;, &lt;code&gt;.xlsx&lt;/code&gt;, &lt;code&gt;.pdf&lt;/code&gt;, code files, and so on. If you have a Google Doc in your Drive, it shows up in Finder as a &lt;code&gt;.gdoc&lt;/code&gt; shortcut that opens in your browser. Cowork can't edit that. It's not a real document file.&lt;/p&gt;

&lt;p&gt;If you want Cowork to work with a Google Doc through the filesystem, you need that document saved or exported as a standard format like &lt;code&gt;.docx&lt;/code&gt; or &lt;code&gt;.md&lt;/code&gt;. Then it's a real file, and Cowork handles it like any other.&lt;/p&gt;

&lt;h2&gt;
  
  
  My Setup (What Actually Works)
&lt;/h2&gt;

&lt;p&gt;Here's the configuration I landed on:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Keep streaming as the global default.&lt;/strong&gt; The whole point of my cloud-first approach is to save local disk space. I don't need years of archived documents taking up room on my laptop.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Selectively mirror the folders I'm actively working in.&lt;/strong&gt; In Finder, I right-click the specific Drive folders I want Cowork to access and choose "Make available offline." Google Drive downloads those folders and keeps them synced locally. Everything else stays streamed.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Grant Cowork access only to those mirrored folders.&lt;/strong&gt; In the Claude desktop app's file system settings, I point it at the mirrored project folders. Not my entire Drive. Not my whole disk. Just the working directories.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Use local-friendly file formats for anything I want Cowork to touch.&lt;/strong&gt; That means &lt;code&gt;.md&lt;/code&gt;, &lt;code&gt;.txt&lt;/code&gt;, &lt;code&gt;.docx&lt;/code&gt;, &lt;code&gt;.xlsx&lt;/code&gt;, and standard code files. If I need to work with a Google Doc through Cowork, I export it first.&lt;/p&gt;

&lt;p&gt;The result: Cowork treats those mirrored Drive folders like normal local directories. It reads and writes files without issues. Google Drive syncs changes back to the cloud automatically. I get the cloud-first storage I wanted with the local AI tooling I need.&lt;/p&gt;

&lt;h2&gt;
  
  
  Quick Reference: Claude Chat vs. Cowork for Google Drive Files
&lt;/h2&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;Claude Chat + Drive Connector&lt;/th&gt;
&lt;th&gt;Cowork + File System Access&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;What it accesses&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Cloud-native Google Docs/Sheets/Slides&lt;/td&gt;
&lt;td&gt;Real files on disk (.docx, .md, .txt, etc.)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Where files live&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Google Drive (cloud)&lt;/td&gt;
&lt;td&gt;Your local filesystem (shared folders)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Google Docs support&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Native, works directly&lt;/td&gt;
&lt;td&gt;Needs export to .docx or similar&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Best for&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Quick document Q&amp;amp;A, cloud-native editing&lt;/td&gt;
&lt;td&gt;Sustained file work, batch operations, code&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Requires&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Google Drive connector enabled&lt;/td&gt;
&lt;td&gt;File system access + mirrored folders&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;h2&gt;
  
  
  What I'd Do Differently
&lt;/h2&gt;

&lt;p&gt;If I were setting this up from scratch, I'd create a dedicated &lt;code&gt;Claude-Projects&lt;/code&gt; folder in Google Drive on day one and set it to mirror immediately. All active working files go there. When a project wraps, I move the folder back to stream-only to reclaim the disk space. That way the boundary between "Cowork can touch this" and "this is just cloud storage" is always clear, and I'm not retroactively figuring out which folders need to be mirrored.&lt;/p&gt;

&lt;h2&gt;
  
  
  The Takeaway
&lt;/h2&gt;

&lt;p&gt;If you're using Google Drive for Desktop and want to work with Claude Cowork's file system access, the key thing to know is that "looks local" and "is local" are not the same thing. Streamed files are placeholders until they're actually downloaded, and Cowork needs real bytes on disk.&lt;/p&gt;

&lt;p&gt;The fix is simple: mirror the specific folders you need, point Cowork at those folders, use standard file formats, and let Drive handle the cloud sync in the background.&lt;/p&gt;

&lt;p&gt;It's a small configuration detail, but it's the kind of thing that can waste an afternoon if you don't know to look for it.&lt;/p&gt;




&lt;p&gt;&lt;em&gt;I work in developer relations and community building, and I'm a builder exploring how AI tools fit into real daily workflows. You can find more of what I'm working on at &lt;a href="https://calebhunter.dev" rel="noopener noreferrer"&gt;calebhunter.dev&lt;/a&gt;. If you're experimenting with Claude Cowork, Claude Code, or similar tools, I'd like to hear how you're setting up your environment. What's working? What tripped you up?&lt;/em&gt;&lt;/p&gt;

</description>
      <category>productivity</category>
      <category>tutorial</category>
      <category>ai</category>
      <category>claude</category>
    </item>
    <item>
      <title>Resurrecting the 1990s Web: Building a VRML Parser in 9 Days with Kiro</title>
      <dc:creator>Caleb Hunter</dc:creator>
      <pubDate>Fri, 05 Dec 2025 21:10:05 +0000</pubDate>
      <link>https://forem.com/hellocaleb/resurrecting-the-1990s-web-building-a-vrml-parser-in-9-days-with-kiro-2jem</link>
      <guid>https://forem.com/hellocaleb/resurrecting-the-1990s-web-building-a-vrml-parser-in-9-days-with-kiro-2jem</guid>
      <description>&lt;p&gt;&lt;em&gt;How AI-assisted development and 20 years of VR expertise brought dead 3D web standards back to life&lt;/em&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  The Problem: Digital Archaeology
&lt;/h2&gt;

&lt;p&gt;While cleaning out some old university archives recently, I stumbled upon something fascinating: thousands of &lt;code&gt;.wrl&lt;/code&gt; files from the 1990s—virtual art galleries, 3D molecular models, early game prototypes—all completely inaccessible in modern browsers.&lt;/p&gt;

&lt;p&gt;VRML (Virtual Reality Modeling Language) was the web's first attempt at 3D content, predating WebGL by over a decade. It died spectacularly when browser plugins fell out of favor, leaving an entire generation of 3D creativity frozen in digital amber.&lt;/p&gt;

&lt;p&gt;As someone who spent 20+ years in VR/AR at Meta, I couldn't let that stand. But there was one problem: I'd been in program management for years, not writing production code.&lt;/p&gt;

&lt;p&gt;Enter Kiro.&lt;/p&gt;

&lt;h2&gt;
  
  
  Why VRML is Terrifyingly Complex
&lt;/h2&gt;

&lt;p&gt;VRML isn't just "old"—it's &lt;strong&gt;aggressively 1990s&lt;/strong&gt;. The syntax has quirks that would make a modern parser cry:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;# Yes, comments start with # like Python
Transform {
  translation 0.5 1.0 0.5  # NOT a JSON array!
  rotation 0 1 0 1.5708    # Axis-angle, NOT Euler angles
  children [
    Shape {
      appearance Appearance {
        material Material {
          transparency 0.5  # 0=opaque (INVERTED from CSS!)
        }
      }
      geometry Box { size 1 1 1 }  # Optional commas everywhere
    }
  ]
}
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Modern parsers assume JSON-like syntax. VRML assumes you're writing in 1997 and have all the time in the world.&lt;/p&gt;

&lt;h2&gt;
  
  
  The Kiro Advantage: Teaching an AI About the Past
&lt;/h2&gt;

&lt;p&gt;Here's where things got interesting. Instead of fighting with Kiro to understand VRML, I taught it using &lt;strong&gt;steering documents&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;I created &lt;code&gt;.kiro/steering/project-context.md&lt;/code&gt; with critical context:&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;## VRML Syntax Quirks&lt;/span&gt;
&lt;span class="p"&gt;-&lt;/span&gt; Uses SFVec3f notation: &lt;span class="sb"&gt;`0.5 1.0 0.5`&lt;/span&gt; (NOT JSON arrays)
&lt;span class="p"&gt;-&lt;/span&gt; Rotations in axis-angle format (x, y, z, angle)
&lt;span class="p"&gt;-&lt;/span&gt; Transparency is 0=opaque, 1=fully transparent (INVERTED from CSS)
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;That last line? &lt;strong&gt;Saved me 6 hours of debugging.&lt;/strong&gt; &lt;/p&gt;

&lt;p&gt;Without steering, every conversation about transparency started with Kiro generating CSS-style opacity code (0=transparent). With steering, it immediately understood VRML's inverted semantics.&lt;/p&gt;

&lt;p&gt;Small investment. Massive ROI.&lt;/p&gt;

&lt;h2&gt;
  
  
  Spec-Driven Development for Complex Parsers
&lt;/h2&gt;

&lt;p&gt;For the core parser logic, I used &lt;strong&gt;spec-driven development&lt;/strong&gt;—writing detailed specifications before any code.&lt;/p&gt;

&lt;p&gt;&lt;code&gt;.kiro/specs/vrml-parser.md&lt;/code&gt; broke VRML into digestible chunks:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Phase 1: Lexer (tokenization, comments)&lt;/li&gt;
&lt;li&gt;Phase 2: Basic nodes (shapes, materials, transforms)&lt;/li&gt;
&lt;li&gt;Phase 3: Advanced geometry (IndexedFaceSet meshes)&lt;/li&gt;
&lt;li&gt;Phase 4: Materials &amp;amp; effects (transparency, emissive colors)&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The IndexedFaceSet parser was the test case. These nodes define real 3D meshes using flat coordinate arrays with &lt;code&gt;-1&lt;/code&gt; separators:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;geometry IndexedFaceSet {
  coord Coordinate {
    point [ 0 0 0, 1 0 0, 1 1 0, 0 1 0 ]
  }
  coordIndex [ 0, 1, 2, -1, 0, 2, 3, -1 ]  # -1 = face boundary
}
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Converting this to Three.js BufferGeometry while calculating face normals? That's a ~150-line function that needs to work perfectly.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;With vibe coding alone:&lt;/strong&gt; 3-4 debugging iterations&lt;br&gt;&lt;br&gt;
&lt;strong&gt;With spec-driven development:&lt;/strong&gt; Worked on first try&lt;/p&gt;

&lt;h2&gt;
  
  
  The Hybrid Approach: When to Spec, When to Vibe
&lt;/h2&gt;

&lt;p&gt;Nine days in, I learned which tool fit which job:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Specs won for:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Complex data structures with edge cases&lt;/li&gt;
&lt;li&gt;Parser logic (deterministic rules)&lt;/li&gt;
&lt;li&gt;Anything that needed to work perfectly first time&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Vibe coding won for:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;UI components (subjective design)&lt;/li&gt;
&lt;li&gt;Quick bug fixes ("the rotations are inverted, flip the sign")&lt;/li&gt;
&lt;li&gt;Creative content (the Halloween graveyard demo scene)&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The key insight: &lt;strong&gt;Use both strategically.&lt;/strong&gt; Don't force specs on subjective design. Don't iterate through vibe coding on complex logic.&lt;/p&gt;

&lt;h2&gt;
  
  
  Agent Hooks: The Secret Weapon
&lt;/h2&gt;

&lt;p&gt;The real productivity unlock? &lt;strong&gt;Agent hooks.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;I created &lt;code&gt;.kiro/hooks/test-scene.sh&lt;/code&gt; that automated:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;VRML syntax validation&lt;/li&gt;
&lt;li&gt;Parser execution on all test files&lt;/li&gt;
&lt;li&gt;A-Frame output generation&lt;/li&gt;
&lt;li&gt;Auto-opening results in browser&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;&lt;strong&gt;Before hooks:&lt;/strong&gt; 3-minute iteration cycle&lt;br&gt;&lt;br&gt;
&lt;strong&gt;After hooks:&lt;/strong&gt; 15-second iteration cycle&lt;/p&gt;

&lt;p&gt;Over 9 days, this saved ~10 hours of manual testing. That's 10 hours I spent adding features instead of clicking buttons.&lt;/p&gt;

&lt;p&gt;The deployment hook was even better—it caught that I'd accidentally added &lt;code&gt;.kiro&lt;/code&gt; to &lt;code&gt;.gitignore&lt;/code&gt;, which would've been &lt;strong&gt;instant disqualification&lt;/strong&gt; from the hackathon.&lt;/p&gt;

&lt;p&gt;Hooks literally saved my submission.&lt;/p&gt;

&lt;h2&gt;
  
  
  The VR Background Advantage
&lt;/h2&gt;

&lt;p&gt;Here's the thing most developers won't tell you about AI-assisted development: &lt;strong&gt;domain expertise is the multiplier.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;My 20 years in VR meant I could describe problems precisely:&lt;/p&gt;

&lt;p&gt;❌ "The 3D models aren't rendering right"&lt;br&gt;&lt;br&gt;
✅ "IndexedFaceSet coordinate arrays with -1 face separators need conversion to Three.js BufferGeometry with proper normal calculation"&lt;/p&gt;

&lt;p&gt;That specificity eliminated trial-and-error iterations. Kiro isn't replacing expertise—it's &lt;strong&gt;amplifying&lt;/strong&gt; it.&lt;/p&gt;

&lt;p&gt;Most Kiroween participants are full-stack web developers. I'm the only one with serious spatial computing experience. That differentiation matters when judges evaluate 3,000+ submissions.&lt;/p&gt;

&lt;h2&gt;
  
  
  What I'd Do Differently
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;I should have used MCP.&lt;/strong&gt; I explored Model Context Protocol for 3D validation but didn't implement due to time constraints. In retrospect, integrating external VRML validation tools would've caught edge cases earlier.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;I should have recorded more.&lt;/strong&gt; Kiro's most impressive moments (generating the IndexedFaceSet converter perfectly on first try) weren't screenshotted. Document everything—you'll want it for writeups.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;I should have started the demo scene earlier.&lt;/strong&gt; The Halloween graveyard with 35 glowing jack-o'-lanterns and transparent ghosts was built on day 8. Starting earlier would've given more iteration time.&lt;/p&gt;

&lt;h2&gt;
  
  
  The Result: Production-Grade in 9 Days
&lt;/h2&gt;

&lt;p&gt;VRML Reborn now parses:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;8 major node types (Shape, Transform, Material, etc.)&lt;/li&gt;
&lt;li&gt;Complex IndexedFaceSet meshes (real 3D geometry)&lt;/li&gt;
&lt;li&gt;Advanced materials (transparency, emissive colors)&lt;/li&gt;
&lt;li&gt;Nested transforms and DEF/USE references&lt;/li&gt;
&lt;li&gt;WebXR with one-click VR mode&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Try it: [your-vercel-url-here]&lt;/p&gt;

&lt;p&gt;Upload any &lt;code&gt;.wrl&lt;/code&gt; file and watch a piece of 1990s web history come back to life.&lt;/p&gt;

&lt;h2&gt;
  
  
  The Real Lesson: AI + Expertise = Magic
&lt;/h2&gt;

&lt;p&gt;Kiro didn't write this project. I didn't write this project. &lt;strong&gt;We built it together.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;The combination of:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Steering docs (teaching Kiro about 1990s quirks)&lt;/li&gt;
&lt;li&gt;Specs (handling complex logic deterministically)&lt;/li&gt;
&lt;li&gt;Vibe coding (rapid UI iteration)&lt;/li&gt;
&lt;li&gt;Hooks (automation that saved hours)&lt;/li&gt;
&lt;li&gt;Domain expertise (20 years of spatial computing)&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;...created something neither of us could have built alone.&lt;/p&gt;

&lt;p&gt;That's the future of development: not AI replacing developers, but AI amplifying what makes each developer unique.&lt;/p&gt;

&lt;p&gt;Now if you'll excuse me, I have 500 more vintage VRML files to resurrect.&lt;/p&gt;

</description>
      <category>hookedonkiro</category>
      <category>kiro</category>
      <category>vrml</category>
    </item>
    <item>
      <title>Burning the Midnight Oil to Bring Back VR from the 90s</title>
      <dc:creator>Caleb Hunter</dc:creator>
      <pubDate>Fri, 05 Dec 2025 03:51:07 +0000</pubDate>
      <link>https://forem.com/hellocaleb/burning-the-midnight-oil-to-bring-back-vr-from-the-90s-5496</link>
      <guid>https://forem.com/hellocaleb/burning-the-midnight-oil-to-bring-back-vr-from-the-90s-5496</guid>
      <description>&lt;p&gt;10:30 PM and I'm &lt;em&gt;this close&lt;/em&gt; to bringing 1997's VRML back from the dead 🎃👻&lt;/p&gt;

&lt;p&gt;Parser finally rendering glowing jack-o'-lanterns and transparent ghosts. &lt;br&gt;
The graveyard is coming alive for @kirodotdev's #Kiroween 🔥&lt;/p&gt;

&lt;p&gt;Tomorrow: demo video, then ship it.&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%2Fg6ms99hirjv9w8hsd1g1.jpg" 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%2Fg6ms99hirjv9w8hsd1g1.jpg" alt=" " width="800" height="376"&gt;&lt;/a&gt; &lt;/p&gt;

</description>
      <category>hookedonkiro</category>
      <category>buildinpublic</category>
    </item>
    <item>
      <title>Update on my Kiroween project 🎃</title>
      <dc:creator>Caleb Hunter</dc:creator>
      <pubDate>Wed, 03 Dec 2025 17:10:17 +0000</pubDate>
      <link>https://forem.com/hellocaleb/update-on-my-kiroween-project-c3l</link>
      <guid>https://forem.com/hellocaleb/update-on-my-kiroween-project-c3l</guid>
      <description>&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%2Fs8dx2xt85505a9aa1b3q.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%2Fs8dx2xt85505a9aa1b3q.png" alt=" " width="601" height="537"&gt;&lt;/a&gt;&lt;br&gt;
Started with a parser that only showed default cubes. Now rendering actual 3D meshes from 90s VRML files!&lt;/p&gt;

&lt;p&gt;The breakthrough: Adding IndexedFaceSet support to parse vertices and face indices into THREE.js BufferGeometry.&lt;/p&gt;

&lt;p&gt;Kiro helped me:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Debug the nested brace matching issue&lt;/li&gt;
&lt;li&gt;Build custom A-Frame geometry components
&lt;/li&gt;
&lt;li&gt;Fix React re-render conflicts with A-Frame registration&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;From "everything is a teal cube" → actual colored 3D shapes ✨&lt;/p&gt;

&lt;p&gt;@kirodotdev &lt;/p&gt;

</description>
      <category>hookedonkiro</category>
      <category>kiroween</category>
    </item>
    <item>
      <title>Debugging with Kiro is a Breeze</title>
      <dc:creator>Caleb Hunter</dc:creator>
      <pubDate>Wed, 03 Dec 2025 16:12:46 +0000</pubDate>
      <link>https://forem.com/hellocaleb/debugging-with-kiro-is-a-breeze-1ipo</link>
      <guid>https://forem.com/hellocaleb/debugging-with-kiro-is-a-breeze-1ipo</guid>
      <description>&lt;p&gt;Just had an "aha" moment debugging with @kirodotdev 🎃&lt;/p&gt;

&lt;p&gt;Building a VRML → WebXR converter for #Kiroween and hit a wall — my parser was showing a default cube for every file.&lt;/p&gt;

&lt;p&gt;Kiro helped me:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Add console logging to trace the issue&lt;/li&gt;
&lt;li&gt;Identified the regex wasn't handling nested braces&lt;/li&gt;
&lt;li&gt;Fixed it in under 5 minutes&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Before: 🟦 (same teal cube for everything)&lt;br&gt;
After: 🔴🌍 (actual red spheres and 3D globes!)&lt;/p&gt;

&lt;p&gt;The conversational debugging flow is a game-changer. Instead of Stack Overflow rabbit holes, I just described the problem and Kiro walked me through it.&lt;/p&gt;

</description>
      <category>hookedonkiro</category>
      <category>kiroween</category>
      <category>webxr</category>
      <category>vr</category>
    </item>
  </channel>
</rss>
