DEV Community

AL
AL

Posted on

I Vibe-Coded a Printing Site to Automate My Signboard Company — Here's What Changed

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.

For years the bottleneck was never production. It was everything around production.

The actual problem was admin, not printing

A typical job used to look like this:

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

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.

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.

So I built Tandaku — a self-serve printing site where the customer does steps 1 through 6 themselves, and the system does step 7.

What "vibe coding" actually meant here

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.

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.

The honest version of that experience:

  • It's absurdly fast for surface area. A catalog spanning dozens of product types, 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.
  • It's not fast for correctness. 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.
  • The domain knowledge is the moat, not the code. 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.

That split — let it build the surface, own the logic — is basically the whole method.

The three things I automated

1. Pricing that updates itself

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.

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 ACP signboard at 2x4 ft shows RM 96.15 today because the numbers behind it are current, not because someone remembered to update a PDF.

The same engine drives the awkward categories too — cut-out letters, where the price depends on font, depth and mounting method, and safety signs, where the artwork already exists and the only variables are size, material and quantity.

This alone killed the single most expensive activity in the business: manually quoting jobs that were never going to convert.

2. Artwork intake that doesn't need me

Customers upload .ai, .pdf, .svg, PNG or JPG, or start from a template. 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.

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.

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

3. Turning enquiries into orders while I sleep

The unlock is that the whole loop closes without me. Price, upload, preflight, pay, track. Orders come in at 11pm from people who would never have waited until Monday for a quote.

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.

Why this matters beyond my own shop

Malaysia has an enormous number of small businesses that need printed things occasionally and irregularly — a new kedai needs a signboard, a contractor needs safety signs, an event needs a bunting and a roll-up stand. Individually tiny, collectively constant.

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.

Removing the quote step changes who can buy. A shop owner in Shah Alam or Puchong 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.

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.

What I'd tell another operator

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.

Some things I'd do differently:

  • Encode the pricing rules before writing any UI. I built screens first and kept retrofitting the logic. Wrong order.
  • Treat generated code near money as untrusted. Read it, test it with real historical orders, check the edges.
  • Ship the boring pages. 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.
  • Don't automate the judgement calls. File preflight is automated; the final designer eye is not. Customers notice the difference.

The calculator is live at tandaku.com 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.

Top comments (0)