Newsletter Issue #5
December 18, 2025 • 5 min read

Here's How I'm Vibe Coding a Desktop Application

By Chris Hartwig

I’ve started vibe coding a desktop application.

The UI is your classic TypeScript/React/shadcn stack, but where the real magic happens is that I’m using Tauri, which uses Rust under the hood. And I don’t know Rust.

I’m a software engineer with 20+ years of experience, and I’m building a desktop app in a language I’ve never written production code in. Here’s how.

The Workflow

Step 1: High-Level Planning with GPT 5.2

I used ChatGPT 5.2 first to have discussions about what I wanted to build. Just conversations about architecture, features, and approach. Once we had clarity, I asked it to summarize our discussions into three markdown documents:

  • tech.md — Technology choices and constraints (that’s where tauri was chosen)
  • functional.md — Feature requirements and user flows (I’m coding an SSLBoard application!)
  • steps.md — 10 development steps toward a v0

These all live in /docs in the project.

Step 2: The Steps Document

The steps.md document is critical. It contains development steps toward v0 of the app, and I requested each step to be:

  1. Testable ie. I can verify it works before moving on
  2. A small deliverable to have incremental progress, not a big bang release at the end

This is how you maintain control in vibe coding. Small, verifiable increments.

Step 3: OpenSpec Changes One Step at a Time

Then I derived an OpenSpec change for each step using GPT 5.2 in Codex-CLI by telling it to look at /docs and /docs/steps.md, one step at a time.

I insist on the “one step at a time” part: do not output 10 OpenSpec changes at the beginning. You’ll learn things at each step that will make for a better spec later as you move forward.

Step 4: Implementation with Codex-CLI

I then had Codex-CLI with GPT 5.1 Codex implement each step, one after the other. At each step:

  • Started a fresh /new context in Codex-CLI
  • Asked it to summarize status in /docs/status.md at the end

I did not edit code by hand.

The Hard Parts

The toughest part was getting AI to use Tailwind CSS v4 when it always wants to use the obsolete v3. PostCSS never works on the first try, and the AI keeps trying to revert back to v3. Had to fight it a little at the start.

But once that was sorted, the rest went smoothly.

The Rust Part

This is the part I was most curious about. How would AI handle Rust? Would it get confused by the borrow checker, lifetimes, and ownership semantics?

Turns out: it’s quite impressive.

The AI implements Tauri commands beautifully. Think of Tauri commands as a backend: the TypeScript UI handles purely UI concerns, while Rust handles the actual logic, file system access, and system integration.

I’ve edited exactly 0 lines of Rust. When I got error messages, I fed them back into Codex-CLI. That’s it.

I don’t know Rust well enough to code it, but I still understand 100% of what’s going on and I review all the code. Turns out, I’m learning rust as I go!

The Numbers

After one day of work:

  • ~3000 lines of Rust, a language I don’t know
  • ~2000 lines of TypeScript
  • 0 lines written by hand

Edit: after one week of work, the numbers are:

  • ~6000 lines of Rust, a language I still don’t know
  • ~4000 lines of TypeScript
  • 0 lines written by hand

And the application is taking shape: I’m excited to reveal it soon!

Why This Works

I believe typed languages make AI coding 100x easier. And Rust, with its memory model captured by the type system, is perhaps the best case for this. When the compiler tells you exactly what’s wrong, and that error message goes straight back to the AI, you get a tight feedback loop. The AI doesn’t have to guess, it knows precisely what to fix.

Conclusion

I was genuinely curious to see if I could work with Rust and whether the AI would get confused. It’s working like a charm, and I made amazing progress in a single day.

Not only is this doable, but it’s highly productive from day one. And I feel comfortable now that I can keep things in control.

The future of vibe coding isn’t just web apps. It’s all applications, systems programming, and languages you’ve never touched. With the right workflow, you can vibe code anywhere.

References

  • OpenSpec — AI-powered tool for generating technical specifications
  • Tauri — Build smaller, faster, and more secure desktop and mobile applications with a web frontend

Photo by Carl Heyerdahl on Unsplash