<?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: AL</title>
    <description>The latest articles on DEV Community by AL (@al_d1de8b97749823b602a1d7).</description>
    <link>https://dev.to/al_d1de8b97749823b602a1d7</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.us-east-2.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F4101667%2F91d0cbf1-a175-4104-a7ea-eab8a842ca1d.png</url>
      <title>DEV Community: AL</title>
      <link>https://dev.to/al_d1de8b97749823b602a1d7</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/al_d1de8b97749823b602a1d7"/>
    <language>en</language>
    <item>
      <title>I Vibe-Coded a Printing Site to Automate My Signboard Company — Here's What Changed</title>
      <dc:creator>AL</dc:creator>
      <pubDate>Sun, 30 Aug 2026 17:42:39 +0000</pubDate>
      <link>https://dev.to/al_d1de8b97749823b602a1d7/i-vibe-coded-a-printing-site-to-automate-my-signboard-company-heres-what-changed-4d0b</link>
      <guid>https://dev.to/al_d1de8b97749823b602a1d7/i-vibe-coded-a-printing-site-to-automate-my-signboard-company-heres-what-changed-4d0b</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.us-east-2.amazonaws.com%2Fuploads%2Farticles%2F6ilwa5ykv9s2948v1668.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.us-east-2.amazonaws.com%2Fuploads%2Farticles%2F6ilwa5ykv9s2948v1668.png" alt=" " width="799" height="537"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;I run a signage and fabrication shop in Selangor, Malaysia. Acrylic signboards, ACP panels, cut letters, safety signs, stickers — the unglamorous stuff that ends up on the front of every shoplot and factory in the country.&lt;/p&gt;

&lt;p&gt;For years the bottleneck was never production. It was everything around production.&lt;/p&gt;

&lt;h2&gt;
  
  
  The actual problem was admin, not printing
&lt;/h2&gt;

&lt;p&gt;A typical job used to look like this:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Customer WhatsApps: "Bang, how much for a 2x4 signboard?"&lt;/li&gt;
&lt;li&gt;I ask what material, what mounting, what thickness. They don't know.&lt;/li&gt;
&lt;li&gt;I open a spreadsheet, work out the price, type it back.&lt;/li&gt;
&lt;li&gt;They ask for a slightly different size. Repeat step 3.&lt;/li&gt;
&lt;li&gt;They send artwork — a JPEG screenshot of a Canva design, at 400px wide.&lt;/li&gt;
&lt;li&gt;I ask for the real file. Two days pass.&lt;/li&gt;
&lt;li&gt;Someone on my team renames it, drops it in the right folder, checks bleed, fixes the resolution.&lt;/li&gt;
&lt;li&gt;Only then does anything get printed.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Steps 1 through 7 took longer than the printing. And every one of them needed a human — usually me. Multiply that by dozens of enquiries a week and you get a business that can't grow past whatever its owner can personally answer in a day.&lt;/p&gt;

&lt;p&gt;Meanwhile, material prices move. Acrylic goes up, aluminium composite goes up, and my quotes are being generated from a spreadsheet that was last accurate three months ago. Either I was quoting too high and losing jobs, or too low and eating the difference.&lt;/p&gt;

&lt;p&gt;So I built &lt;a href="https://tandaku.com" rel="noopener noreferrer"&gt;Tandaku&lt;/a&gt; — a self-serve printing site where the customer does steps 1 through 6 themselves, and the system does step 7.&lt;/p&gt;

&lt;h2&gt;
  
  
  What "vibe coding" actually meant here
&lt;/h2&gt;

&lt;p&gt;I'm not a full-time developer. I've written internal tooling for years — quotation calculators, DXF processing scripts, laser parameter tables — but always the ugly, works-on-my-machine kind.&lt;/p&gt;

&lt;p&gt;Tandaku got built the vibe coding way: describe the thing, let the model write it, run it, tell it what's wrong, repeat. Next.js on Vercel, Supabase for data and auth, HitPay for DuitNow/FPX/card payments.&lt;/p&gt;

&lt;p&gt;The honest version of that experience:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;It's absurdly fast for surface area.&lt;/strong&gt; A catalog spanning &lt;a href="https://tandaku.com/products" rel="noopener noreferrer"&gt;dozens of product types&lt;/a&gt;, material pages, category pages, city landing pages, an order tracker — things I would have quietly never built because each one felt like a weekend, and instead took an afternoon.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;It's not fast for correctness.&lt;/strong&gt; Pricing logic is where the money is, and it's where I stopped vibing and started reading every line. A rounding bug in a quotation engine isn't a UI glitch, it's a margin leak that compounds silently across every order.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;The domain knowledge is the moat, not the code.&lt;/strong&gt; The model can write a pricing function. It cannot know that a 3mm acrylic sheet has a usable yield that makes certain sizes disproportionately wasteful, or which cut shapes eat laser time. That part was mine to encode.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;That split — let it build the surface, own the logic — is basically the whole method.&lt;/p&gt;

&lt;h2&gt;
  
  
  The three things I automated
&lt;/h2&gt;

&lt;h3&gt;
  
  
  1. Pricing that updates itself
&lt;/h3&gt;

&lt;p&gt;The core of the site is a live calculator. Pick a product, pick a material, type a width and height in millimetres, choose a quantity, get a price. Not a quote request. A price.&lt;/p&gt;

&lt;p&gt;Under the hood it's a rule set per material: sheet cost, usable yield, cut and print time, finishing, plus the size-dependent penalties I used to apply by feel. When my supplier's acrylic price changes, I change one input and every derived price across the catalog moves with it. An &lt;a href="https://tandaku.com/print/acp-signboard" rel="noopener noreferrer"&gt;ACP signboard&lt;/a&gt; at 2x4 ft shows RM 96.15 today because the numbers behind it are current, not because someone remembered to update a PDF.&lt;/p&gt;

&lt;p&gt;The same engine drives the awkward categories too — &lt;a href="https://tandaku.com/shop/cut-out-letters" rel="noopener noreferrer"&gt;cut-out letters&lt;/a&gt;, where the price depends on font, depth and mounting method, and &lt;a href="https://tandaku.com/safety-signs" rel="noopener noreferrer"&gt;safety signs&lt;/a&gt;, where the artwork already exists and the only variables are size, material and quantity.&lt;/p&gt;

&lt;p&gt;This alone killed the single most expensive activity in the business: manually quoting jobs that were never going to convert.&lt;/p&gt;

&lt;h3&gt;
  
  
  2. Artwork intake that doesn't need me
&lt;/h3&gt;

&lt;p&gt;Customers upload &lt;code&gt;.ai&lt;/code&gt;, &lt;code&gt;.pdf&lt;/code&gt;, &lt;code&gt;.svg&lt;/code&gt;, PNG or JPG, or start from a &lt;a href="https://tandaku.com/templates" rel="noopener noreferrer"&gt;template&lt;/a&gt;. The system checks resolution against the physical print size, checks dimensions and bleed, and flags problems before anything reaches the machine — with a human designer reviewing behind it as the backstop.&lt;/p&gt;

&lt;p&gt;Files land in a predictable structure tied to the order, so nobody on my production floor is hunting through a WhatsApp thread for "final_final_v3.jpg". The naming, the foldering, the routing to the right machine queue — all of it happens on upload instead of being someone's morning job.&lt;/p&gt;

&lt;p&gt;If a file genuinely can't be used, the customer gets told immediately, not two days later when we tried to print it.&lt;/p&gt;

&lt;h3&gt;
  
  
  3. Turning enquiries into orders while I sleep
&lt;/h3&gt;

&lt;p&gt;The unlock is that the whole loop closes without me. Price, upload, preflight, pay, &lt;a href="https://tandaku.com/track" rel="noopener noreferrer"&gt;track&lt;/a&gt;. Orders come in at 11pm from people who would never have waited until Monday for a quote.&lt;/p&gt;

&lt;p&gt;No minimum order, no setup fee, no artwork fee, no deposit negotiation. Production stays at 1–2 days because the job arrives ready to print rather than needing a round of clarification first.&lt;/p&gt;

&lt;h2&gt;
  
  
  Why this matters beyond my own shop
&lt;/h2&gt;

&lt;p&gt;Malaysia has an enormous number of small businesses that need printed things occasionally and irregularly — a new kedai needs a &lt;a href="https://tandaku.com/shop/signboard" rel="noopener noreferrer"&gt;signboard&lt;/a&gt;, a contractor needs safety signs, an event needs a bunting and a roll-up stand. Individually tiny, collectively constant.&lt;/p&gt;

&lt;p&gt;The traditional path for them is: find a printer, WhatsApp for a quote, wait, negotiate, wait again, hope the artwork is acceptable. The friction is so high that a lot of businesses just live with a faded sign for another year.&lt;/p&gt;

&lt;p&gt;Removing the quote step changes who can buy. A shop owner in &lt;a href="https://tandaku.com/signboard-printing/shah-alam" rel="noopener noreferrer"&gt;Shah Alam&lt;/a&gt; or &lt;a href="https://tandaku.com/signboard-printing/puchong" rel="noopener noreferrer"&gt;Puchong&lt;/a&gt; can price a job at midnight, decide it's affordable, upload the artwork, and have it in a few days — without a sales conversation, a minimum order, or a deposit.&lt;/p&gt;

&lt;p&gt;And because the automation removes the labour that used to sit around every small job, small jobs stop being unprofitable. That's the part that actually keeps prices low: I'm not pricing in the two hours of back-and-forth any more, because there isn't any.&lt;/p&gt;

&lt;h2&gt;
  
  
  What I'd tell another operator
&lt;/h2&gt;

&lt;p&gt;If you run a business where a human manually produces the same calculation over and over, that calculation is a product waiting to be extracted. You probably already have the logic — it's in a spreadsheet, or in your head. The gap between that and a working self-serve site is much smaller than it was two years ago.&lt;/p&gt;

&lt;p&gt;Some things I'd do differently:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Encode the pricing rules before writing any UI.&lt;/strong&gt; I built screens first and kept retrofitting the logic. Wrong order.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Treat generated code near money as untrusted.&lt;/strong&gt; Read it, test it with real historical orders, check the edges.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Ship the boring pages.&lt;/strong&gt; Category pages, guides, city pages, FAQ. They're tedious to write by hand, which is exactly why they never got built before — and exactly what AI assistance is genuinely good at.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Don't automate the judgement calls.&lt;/strong&gt; File preflight is automated; the final designer eye is not. Customers notice the difference.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The calculator is live at &lt;a href="https://tandaku.com" rel="noopener noreferrer"&gt;tandaku.com&lt;/a&gt; if you want to poke at it — type any size and watch the price move. Happy to answer questions about the pricing engine or the file pipeline in the comments.&lt;/p&gt;

</description>
      <category>sideprojects</category>
      <category>nextjs</category>
      <category>automation</category>
      <category>startup</category>
    </item>
  </channel>
</rss>
