<?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: Frank Thomas</title>
    <description>The latest articles on DEV Community by Frank Thomas (@trankly).</description>
    <link>https://dev.to/trankly</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%2F3960303%2Fdf5a0317-e709-4a5e-b6ba-e87b8bb44196.jpeg</url>
      <title>DEV Community: Frank Thomas</title>
      <link>https://dev.to/trankly</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/trankly"/>
    <language>en</language>
    <item>
      <title>When to kill v1</title>
      <dc:creator>Frank Thomas</dc:creator>
      <pubDate>Sun, 31 May 2026 13:39:47 +0000</pubDate>
      <link>https://dev.to/trankly/when-to-kill-v1-on7</link>
      <guid>https://dev.to/trankly/when-to-kill-v1-on7</guid>
      <description>&lt;p&gt;You built the thing. It shipped. Customers use it. Revenue comes in. And now you spend 80% of your time on technical debt instead of features.&lt;/p&gt;

&lt;p&gt;That's not a code quality problem. That's v1 telling you it's done.&lt;/p&gt;




&lt;p&gt;I've built four companies. Every single one hit this moment. The product works, mostly. Customers tolerate the rough edges because they're bought in. But the architecture can't absorb what comes next — not because anyone made bad decisions, but because you didn't know enough when you started.&lt;/p&gt;

&lt;p&gt;At Superkey, we built an insurance operations platform. V1 shipped fast and iterated faster. We didn't understand the domain deeply enough to design it right the first time, and that was fine — that was the point. V1 was a learning aid. The mistake was not recognizing when the learning was done and the aid had become the problem.&lt;/p&gt;

&lt;h2&gt;
  
  
  How V1 dies
&lt;/h2&gt;

&lt;p&gt;It doesn't explode. It suffocates.&lt;/p&gt;

&lt;p&gt;You notice it when feature requests start taking three times longer than they should. When every change requires touching four other things. When the team spends more time explaining workarounds to customers than building solutions.&lt;/p&gt;

&lt;p&gt;At Superkey, the symptoms were specific:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;We built for flexibility before we understood the domain.&lt;/strong&gt; The system could handle any workflow. Nobody could explain what it did. We took feature requests from too many stakeholders with competing goals — each request was a bandaid on a bandaid on a system that was never designed for what it had become.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;We skipped the API layer.&lt;/strong&gt; We used Supabase RPC functions extensively for data access because we were still discovering our entities, access patterns, and boundaries. The plan was always to move to a stable API eventually. "Eventually" dragged on too long, and every client was coupled to database internals. When definitions changed — and they changed often — everything broke.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;We rebuilt the extraction pipeline three times.&lt;/strong&gt; The first iteration used Vellum, a UI wrapper around OpenAI calls. No OCR, no scanned documents — only PDFs with embedded text. The second pass moved to Google Document AI. Expensive and unreliable. The third iteration bought LlamaIndex and discovered we needed to build everything around it anyway — all the orchestration, validation, and domain logic that makes extraction actually work in production. Three stacks, three migrations, same fundamental problem: we were learning what extraction needed by building it wrong.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Our assumptions were flawed in ways we couldn't have known.&lt;/strong&gt; We thought AI could own more of the process than it can. We thought ERP data would be reliable enough to automate against. We thought the user base would stabilize. None of that was true, and v1 was built on those assumptions.&lt;/p&gt;

&lt;h2&gt;
  
  
  The 80% line
&lt;/h2&gt;

&lt;p&gt;Here's the heuristic I use: when you're spending more time servicing the system than extending it, v1 is done.&lt;/p&gt;

&lt;p&gt;Not 50/50. That's normal — every codebase has maintenance overhead. The alarm goes off at 80/20. When eight out of ten engineering hours go to debugging existing behavior, patching data issues, and explaining limitations to customers instead of shipping the thing that wins the next deal.&lt;/p&gt;

&lt;p&gt;At that point, you're not maintaining a product. You're running hospice care for an architecture that can't support what you've learned.&lt;/p&gt;

&lt;h2&gt;
  
  
  How to kill it
&lt;/h2&gt;

&lt;p&gt;The team wasn't surprised when I said it was time. They were concerned about productivity — rightfully so. A rewrite is months of building with nothing to show customers. If you handle the transition wrong, you lose the team's trust, the customers' patience, or both.&lt;/p&gt;

&lt;p&gt;Here's what worked:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Put v1 on life support, publicly.&lt;/strong&gt; We told the team and stakeholders: no new feature requests on v1. Bug fixes and critical patches only. This sounds obvious but most teams try to run v1 and v2 in parallel, and the v2 timeline doubles because nobody can focus.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Present the migration plan before you start building.&lt;/strong&gt; The team needs to know this isn't a vanity rewrite. Show the continuity plan — which customers stay on v1, how long, what breaks if v2 is late. Make the constraints visible so the team can hold you accountable.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Start v2 with specifications, not code.&lt;/strong&gt; This was the biggest difference. V1 started with code and discovered the design through iteration. V2 started with written specs, a designed UI, deep specifications for how the entire system would work, and a standardized API. We wrote the system down before we built it. Not because we're waterfall converts — because we'd already done the discovery. V1 was the discovery phase. V2 was the engineering phase.&lt;/p&gt;

&lt;h2&gt;
  
  
  V1 was the point
&lt;/h2&gt;

&lt;p&gt;Here's the thing nobody says about rewrites: v1 was the most important thing you built. Not because it shipped to customers — because it taught you what to build next.&lt;/p&gt;

&lt;p&gt;Every flawed assumption, every wrong abstraction, every pipeline you rebuilt three times — that's domain knowledge you couldn't have acquired any other way. The Supabase RPC functions that coupled everything to the database? They taught us what our actual access patterns were. The three extraction pipelines? They taught us what extraction actually requires in production. The competing feature requests? They taught us which users matter and which workflows are real.&lt;/p&gt;

&lt;p&gt;You can't skip v1. You can't design v2 without having built v1 first. The founders who pretend they got the architecture right on the first try are either lying or building something simple enough that it didn't matter.&lt;/p&gt;

&lt;h2&gt;
  
  
  The rewrite tax
&lt;/h2&gt;

&lt;p&gt;Every company I've built has hit this. Some people get lucky and their v1 carries them to an exit. Most don't. And the cost of not rewriting is invisible until it's catastrophic — you can't respond to customer requests fast enough, you lose deals to more nimble competitors, and the team burns out maintaining a system they know is wrong.&lt;/p&gt;

&lt;p&gt;The pace of shipping keeps accelerating. Five years ago, a sluggish v1 might survive because competitors were equally slow. Today, a two-person team with modern tooling can build in weeks what took your team months. If your v1 is preventing you from winning business, the math is simple: pay down the debt and build v2, or sell the company, because a faster competitor is already coming.&lt;/p&gt;

&lt;p&gt;V1 is a learning aid. Treat it like one. Use it to discover what you don't know, document what you learn, and kill it before it kills your momentum.&lt;/p&gt;

</description>
      <category>programming</category>
      <category>startup</category>
      <category>leadership</category>
      <category>techdebt</category>
    </item>
  </channel>
</rss>
