<?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: Kalin Pezhgorski</title>
    <description>The latest articles on DEV Community by Kalin Pezhgorski (@pezhgorski).</description>
    <link>https://dev.to/pezhgorski</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%2F3956654%2F2addcd4a-4d0e-4d3f-be69-ba84221fe9e4.png</url>
      <title>DEV Community: Kalin Pezhgorski</title>
      <link>https://dev.to/pezhgorski</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/pezhgorski"/>
    <language>en</language>
    <item>
      <title>3 weeks, 0 Rust, 1 shipped app: what worked with Claude Code for a C++ dev.</title>
      <dc:creator>Kalin Pezhgorski</dc:creator>
      <pubDate>Fri, 29 May 2026 06:59:12 +0000</pubDate>
      <link>https://dev.to/pezhgorski/3-weeks-0-rust-1-shipped-app-what-worked-with-claude-code-for-a-c-dev-53c4</link>
      <guid>https://dev.to/pezhgorski/3-weeks-0-rust-1-shipped-app-what-worked-with-claude-code-for-a-c-dev-53c4</guid>
      <description>&lt;p&gt;I write C++ full-time. Before this, I had never touched Rust.&lt;/p&gt;

&lt;p&gt;Three weeks ago I read an article about offline background removal and started building a desktop photo editor for marketplace sellers — the eBay, Etsy, Amazon FBA crowd. Background removal, lighting fix, 4x upscaling, smart crop to marketplace dimensions. It runs entirely offline on the GPU using ONNX models.&lt;/p&gt;

&lt;p&gt;I didn't know what ONNX was when I started. Honestly, even now, don't ask me to explain it.&lt;/p&gt;

&lt;h2&gt;
  
  
  The stack
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Tauri v2&lt;/strong&gt; (Rust backend + React/TypeScript frontend)&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;ONNX Runtime&lt;/strong&gt; with CUDA, running 4 ML models&lt;/li&gt;
&lt;li&gt;All image processing in Rust. The frontend just displays results.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Somewhere along the way we ported the IAT exposure-correction model to ONNX and put it on HuggingFace. As far as I can tell, nobody had published an ONNX export of it before. I had never downloaded anything from HuggingFace before this project, let alone uploaded to it. Claude handled all of it.&lt;/p&gt;

&lt;h2&gt;
  
  
  Knowing C++ helped — but not how I expected
&lt;/h2&gt;

&lt;p&gt;I assumed my background would help me read Rust. It didn't, much. The borrow checker is its own animal.&lt;/p&gt;

&lt;p&gt;What actually helped: I could usually tell when Claude was doing something dumb, and stop it before it dug a hole. I barely understood the Rust it was writing, but I understood &lt;em&gt;bad engineering&lt;/em&gt; when I saw it. Wrong abstraction, a function doing five things, copy-pasted logic that should've been shared — that stuff looks the same in any language.&lt;/p&gt;

&lt;p&gt;So I spent a lot of energy drilling one rule again and again: single class, single responsibility. Break up the monoliths. Kill the duplication. It made debugging far less painful later.&lt;/p&gt;

&lt;h2&gt;
  
  
  The one habit that saved me
&lt;/h2&gt;

&lt;p&gt;Ask for a code review after &lt;em&gt;every&lt;/em&gt; implementation step, not at the end.&lt;/p&gt;

&lt;p&gt;That's it. That's the whole trick. It caught structural problems while they were still cheap to fix. The alternative — building for three weeks and then asking "okay, is this any good?" — would have been a nightmare.&lt;/p&gt;

&lt;p&gt;One catch: Claude sometimes gets lazy and decides a reviewer's feedback is "minor" and not worth acting on. Sometimes it's right. Sometimes it isn't. This is exactly where having &lt;em&gt;some&lt;/em&gt; coding experience pays off — you can tell whether "minor" actually means minor, or whether it's about to bite you.&lt;/p&gt;

&lt;h2&gt;
  
  
  The lesson I learned the hard way: don't let it agree with you
&lt;/h2&gt;

&lt;p&gt;This one cost me real time before I figured it out.&lt;/p&gt;

&lt;p&gt;If you ask the model a leading question, it tends to confirm your guess instead of checking. The framing leaks into the answer.&lt;/p&gt;

&lt;p&gt;The dangerous version isn't a factual question. "Does function X take argument Y?" is leading, but it won't really fool you — there's one right answer and you'll catch it the moment you look. What fools you is a design hunch phrased as a suggestion:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;"Maybe the right place for function X is in class Y?"&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;There's no single fact to check there. It's a judgment call. And the model will happily agree, move the function, restructure around it, and hand you back a confident rewrite built entirely on your half-formed guess. You won't notice until the abstraction feels wrong three steps later.&lt;/p&gt;

&lt;p&gt;The fix is to ask what's true, not whether your guess is true:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Bad: "Maybe function X belongs in class Y?"&lt;/li&gt;
&lt;li&gt;Good: "Where does function X belong, and why? What are the trade-offs?"&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Same thing when you send subagents off to check assumptions. Phrase the task as an open question, not a confirmation, or they'll come back telling you what you wanted to hear. I eventually wrote this into my project instructions so it'd stop happening: when my own prompt is phrased as a confirmation, restate it as an open question first, then answer. Catching the bias before the answer is written saves you from debugging a fantasy later.&lt;/p&gt;

&lt;h2&gt;
  
  
  What else Claude did
&lt;/h2&gt;

&lt;p&gt;Basically everything outside the core app:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;The landing page&lt;/li&gt;
&lt;li&gt;SEO&lt;/li&gt;
&lt;li&gt;Privacy policy&lt;/li&gt;
&lt;li&gt;Hosting and analytics&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;I'm not an expert in any of that, and I'd never launched anything before. It works. Windows and Linux builds are both running. The site is at &lt;a href="https://listinggems.com" rel="noopener noreferrer"&gt;listinggems.com&lt;/a&gt;, and I just hooked up payments.&lt;/p&gt;

&lt;p&gt;For a first-timer who'd never shipped a product, the non-code parts (hosting, analytics, payments provider, the legal boilerplate) were not the small tasks I expected them to be. Worth saying out loud, because nobody warns you about that part.&lt;/p&gt;




&lt;h2&gt;
  
  
  I could use some beta testers
&lt;/h2&gt;

&lt;p&gt;I want to test on hardware I don't have. Specifically: &lt;strong&gt;I haven't benchmarked AMD GPUs on Windows at all.&lt;/strong&gt; If that's you, I'd love your numbers.&lt;/p&gt;

&lt;p&gt;Happy to hand out free keys to anyone willing to test. And I'm glad to answer questions about any of it — the plugins, the workflow, the Tauri/ONNX setup, how I got Claude to behave. Ask away in the comments.&lt;/p&gt;

</description>
      <category>ai</category>
      <category>rust</category>
      <category>buildinpublic</category>
      <category>claude</category>
    </item>
  </channel>
</rss>
