<?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: P_A</title>
    <description>The latest articles on DEV Community by P_A (@p_a1da0c47a9c7f6).</description>
    <link>https://dev.to/p_a1da0c47a9c7f6</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%2F3961785%2F926d613d-4d98-4bf2-870f-0989522fb3a3.png</url>
      <title>DEV Community: P_A</title>
      <link>https://dev.to/p_a1da0c47a9c7f6</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/p_a1da0c47a9c7f6"/>
    <language>en</language>
    <item>
      <title>I Cold-Called 50 Contractors Before I Wrote a Line of Code. The AI Was the Easy Part.</title>
      <dc:creator>P_A</dc:creator>
      <pubDate>Wed, 03 Jun 2026 14:05:54 +0000</pubDate>
      <link>https://dev.to/p_a1da0c47a9c7f6/i-cold-called-50-contractors-before-i-wrote-a-line-of-code-the-ai-was-the-easy-part-1flk</link>
      <guid>https://dev.to/p_a1da0c47a9c7f6/i-cold-called-50-contractors-before-i-wrote-a-line-of-code-the-ai-was-the-easy-part-1flk</guid>
      <description>&lt;p&gt;I built the first version in an afternoon.&lt;/p&gt;

&lt;p&gt;Throw a job description at an LLM. Ask for a price. Render the number.&lt;/p&gt;

&lt;p&gt;It was useless. And the reason it was useless is the whole point of this post.&lt;/p&gt;

&lt;h2&gt;
  
  
  The afternoon prototype that lied with confidence
&lt;/h2&gt;

&lt;p&gt;The naive build demos beautifully. Ask it to price "repaint a 12x14 bedroom" and it hands back a clean, confident dollar figure every single time.&lt;/p&gt;

&lt;p&gt;The problem is that the figure is fiction.&lt;/p&gt;

&lt;p&gt;Too high, the contractor loses the job. Too low, they eat the loss out of their own pocket. And a model that hallucinates a number the contractor then says out loud to a paying customer is worse than no tool at all, because now it's &lt;em&gt;their&lt;/em&gt; name on a guess, not mine.&lt;/p&gt;

&lt;p&gt;So I closed the editor and started dialing.&lt;/p&gt;

&lt;h2&gt;
  
  
  50 phone calls beat 50 hours of market research
&lt;/h2&gt;

&lt;p&gt;I cold-called about fifty handymen, carpenters, and remodelers and asked one question: what do you actually hate about running this business?&lt;/p&gt;

&lt;p&gt;The answer was almost unanimous, and it had nothing to do with swinging a hammer. It was &lt;strong&gt;estimating&lt;/strong&gt;. Drive across town, measure everything, build a detailed quote on your own time, then watch more than half of those quotes go nowhere because the customer was only ever shopping for a cheaper number.&lt;/p&gt;

&lt;p&gt;One guy nailed it: at least 60% of his estimates died because the customer "always knows somebody being the cheapest."&lt;/p&gt;

&lt;p&gt;That reframed the entire product. The job was never "generate a number." Any tool can generate a number. The job was generate a number a contractor will stake their reputation on. Call it the &lt;strong&gt;trust gap&lt;/strong&gt;, and it's the only problem that actually mattered.&lt;/p&gt;

&lt;h2&gt;
  
  
  The engineering problem
&lt;/h2&gt;

&lt;p&gt;I'll keep the secret sauce vague, that part is the business. But the shape of it:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Ground the model so it can't freewheel.&lt;/strong&gt; Job details, photos, and external property data all go in as hard context it has to reason from.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Wrap the probabilistic layer in a deterministic one.&lt;/strong&gt; The LLM is great at parsing messy human descriptions and genuinely bad at arithmetic and consistency, so it never gets the final word on the math.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Let it learn each contractor's real pricing over time,&lt;/strong&gt; so the output converges on &lt;em&gt;their&lt;/em&gt; numbers, not a national average.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The mental model that fixed everything: the LLM's job is to translate and interpret. The pricing decision lives somewhere it can't hallucinate. The day I stopped treating the model as the source of truth, the whole thing got reliable.&lt;/p&gt;

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

&lt;p&gt;I kept it deliberately boring. Boring scales. Clever breaks at 2am.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;code&gt;Next.js&lt;/code&gt; (App Router), front and back in one place. Server Actions kept the AI and pricing logic server-side with no separate API service to babysit.&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;TypeScript&lt;/code&gt;, strict mode. AI features ship with enough nondeterminism already.&lt;/li&gt;
&lt;li&gt;An LLM provider for the language layer (not saying which, or how it's prompted).&lt;/li&gt;
&lt;li&gt;A third-party property-data API so the model isn't guessing square footage.&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;Stripe&lt;/code&gt; for collecting payment from the homeowner directly.&lt;/li&gt;
&lt;li&gt;Managed Postgres and auth, because I'm one person and I'm not running my own infra.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  The plot twist: I wasn't building an estimator
&lt;/h2&gt;

&lt;p&gt;I thought estimating was the product. The contractors taught me it was the wedge.&lt;/p&gt;

&lt;p&gt;That same "what would you delete forever?" question kept surfacing the &lt;em&gt;same cluster&lt;/em&gt;: chasing late payments, scope-creep fights, scheduling collisions, invoices at 10pm, receipts lost before tax season. A tool that &lt;em&gt;only&lt;/em&gt; estimated would have been easy to ignore.&lt;/p&gt;

&lt;p&gt;So the build grew into everything that happens after an estimate gets accepted. Payment collection. A customer portal. Scheduling that respects the calendar. Auto-invoicing. Scope boundaries set up front so nobody fights about "I thought that was included" three weeks later.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;The lesson I keep relearning: talk to users before you fall in love with your feature.&lt;/strong&gt; The AI estimate was real. Shipping only it would have failed.&lt;/p&gt;

&lt;p&gt;It's live at &lt;a href="https://trylightwork.com" rel="noopener noreferrer"&gt;trylightwork.com&lt;/a&gt; if you want to see where it landed.&lt;/p&gt;

&lt;h2&gt;
  
  
  What was actually hard
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Trust calibration.&lt;/strong&gt; Getting someone to believe an AI number comes down to transparency as much as accuracy. Showing the inputs and the reasoning mattered as much as the figure.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Grounding against hallucination.&lt;/strong&gt; The part I iterated on most and say the least about.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Payments.&lt;/strong&gt; The one place where "move fast and break things" is just "lawsuit." I leaned entirely on &lt;code&gt;Stripe&lt;/code&gt; primitives and refused to be clever.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Being solo.&lt;/strong&gt; Nobody to catch my bad assumptions. The 50 phone calls were my code review for product decisions.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;If you're building for an industry that usually gets garbage software (trades, home services, the unglamorous stuff), I think that's where the real opening is right now because the incumbents are slow and the users are starving for anything that respects their time.&lt;/p&gt;

&lt;p&gt;So I'll throw it to you: &lt;strong&gt;if you've shipped an AI feature into a non-technical, high-stakes vertical, how did you actually get users to trust the output?&lt;/strong&gt; That's the part I'm still working on.&lt;/p&gt;

</description>
      <category>ai</category>
      <category>nextjs</category>
      <category>saas</category>
      <category>buildinpublic</category>
    </item>
  </channel>
</rss>
