Building the operating system for a sign shop.
Over five months I designed and built a custom, self-hosted business platform for Custom Graphics & Sign Designs — replacing a subscription shop-management system with software shaped around how the shop actually works, plus the infrastructure, security and facility systems underneath it.
01 — THE CHALLENGE
Off-the-shelf software that the shop was constantly working around.
CG Signs ran on a subscription shop-management system built for the sign industry at large. It handled the basics — but the data model fought how the shop actually works.
02 — WHAT I BUILT
One record that runs the whole job, from the first email to the final payment.
Next.js · TypeScript · PostgreSQL · Docker · Claude Code
03 — THE RESULT
1,100+
Catalog items priced live, so vendor price increases reach every quote.
THE PROBLEM
The gaps showed up as lost time and lost margin.
- Pricing drifted silently. Purchase orders and the materials catalog didn’t talk to each other, so vendor price increases never reached the quotes.
- Estimating lived in people’s heads. Most of the shop’s work is custom manufacturing, priced item by item. The software assumed a simpler model, so real estimates happened in spreadsheets.
- Email lived somewhere else. Customer requests, proofs and follow-ups sat in Outlook, disconnected from the jobs they belonged to.
- Files lived somewhere else, too. Production files were on the shop’s file server; the system of record had no idea they existed.
- Every month cost money. A recurring subscription for software the team was constantly working around.
A shop this size can’t afford a lot of things — but it can’t afford software that makes every job slower, either.
THE APPROACH
A design document first, not code.
I started with the full data model, every module, the integrations and a phased build plan. Four principles came out of it and held through every decision since.
- Built around the shop The quoting model mirrors how the shop manufactures: a quote is a set of products, and each product is a bill of materials — materials, labor, equipment and subcontract lines, each with its own cost and margin. When a quote is accepted, that same bill of materials becomes the production job. Nobody re-enters anything.
- Own the stack The platform runs on the shop’s own hardware, on its own network, with its own backups. Files stay on the shop’s file server, where the team already works.
- AI designed in, not bolted on The platform ships with its own MCP server, so Claude can look up a customer, build a quote or check an order from a chat window — with the same permissions as the person asking.
- Cut recurring costs, not corners Free and self-hosted is the default. When a free option doesn’t do the job well, the shop pays for the one that does.
THE PLATFORM
CGSigns OS runs the whole job.
From the first email to the final payment — one record that carries the quote, the proof, the production job, the purchase orders, the invoice and every file and conversation along the way.
-
Estimating
Parametric calculators for printed vinyl, banners, magnetics, panel signs, channel letters and vehicle wraps — enter the panel sizes and the materials, labor and machine time price themselves from a live catalog of 1,100+ items. A complexity slider adjusts the build up or down in 5% steps.
-
Engineering
A preliminary structural calculator for freestanding signs — ASCE 7 wind loads, steel post sizing and pier or spread-footing checks — that sends its results straight into a quote. Final design still goes to the shop’s engineer of record.
-
Proposals
Branded PDF proposals, orders, invoices and receipts, sent from the rep’s own Microsoft 365 mailbox. Customers approve and pay a deposit online, and every view is logged.
-
Design & proofing
Versioned design proofs with online approval, plus AI sign mockups — a site photo is calibrated to real-world scale, the sign is placed at its true size and an image model renders it in place.
-
Production
Sales orders spawn jobs whose bill of materials comes straight from the quote. Workflow steps, assignments, due dates and a production board show the shop what’s next.
-
Purchasing & inventory
Purchase needs flow from each job’s bill of materials into vendor POs. Received prices feed back into the catalog, so quotes stay current.
-
Time
Job timers that split labor across concurrent jobs, plus a touchscreen attendance kiosk with weekly timesheets for payroll.
-
Money
Card and ACH payments through Square, deposits, allocations, statements and AR aging, with a two-way QuickBooks Online sync that can hold postings for review before they send.
-
Communication
Each user’s Outlook inbox inside the app, two-way calendar sync for installs, and an email intake that uses Claude to classify inbound requests, match them to the customer and queue them for the right person.
-
Customer portal
Customers sign in with an emailed link to see quotes, proofs, invoices and balances.
-
Facility
Equipment and facility maintenance schedules, in-app bug reports and feature requests from the team.
Every operation the team uses daily is also exposed through the platform’s MCP connector. Anything that emails a customer, records a payment or changes a contact never runs on its own — it queues for a person to approve.
HOW IT FITS TOGETHER
- Staff Quoting, production, purchasing and money — plus their own Outlook inbox.
- Customers A portal for quotes, proofs, invoices and balances, opened with an emailed link.
- Claude Through the MCP connector, with the same permissions as the person asking.
One record per job
- Estimating
- Engineering
- Proposals
- Design & proofing
- Production
- Purchasing & inventory
- Time
- Money
- Communication
- Customer portal
- Facility
- Microsoft 365 Sign-in, mailboxes and calendars.
- QuickBooks Online Two-way accounting sync.
- Square Card and ACH payments.
- File server Production files, where the team already works.
MOVING THE HISTORY
New software is only useful if the past comes with it.
I’m migrating the full history from the former shop-management software — not just open jobs — so a customer’s record in CGSigns OS looks the way it always has, only better organized. That meant building a migration pipeline rather than running a one-time export.
- 01 Extract A resumable, rate-limited extractor pulls every company, contact, quote, order, invoice and payment through the vendor’s API. Notes, tasks and attached files the public API couldn’t reach are collected in batched, read-only passes — about 17,000 files in all.
- 02 Transform Mapping rules recover details the source data loses along the way — truncated quantities, HTML descriptions, voided and refunded payments — and refuse to load duplicates.
- 03 Load and file Records load with their original numbers, and attachments are filed into each project’s folder on the file server.
- 04 Catch up A delta pass compares the live system to what was loaded and sorts every difference — new, changed, conflicting or deleted — so cutover day only moves what changed.
The cutover itself is a single, rehearsed date with readiness gates, a runbook and a rollback plan. No parallel run, no half-in, half-out.
THE FOUNDATION
Infrastructure and security.
Self-hosting only works if the foundation is solid, so a large share of the work happened below the application.
- Isolated services. The platform, development tools, cameras and signage each run separately on the shop’s own hardware, so a problem in one stays in one.
- A rebuilt rack. Faster switching, battery backup sized to the load and new fiber — with a live cable-tracing tool built for the rebuild.
- Code stays in-house. Every internal app is built, reviewed and tested on the shop’s own development server, so code never depends on an outside service.
- Patched automatically. Machines and containers are checked for vulnerabilities and kept patched; anything that needs a person is flagged first thing in the morning.
- Backed up and watched. Nightly backups with a second copy, and alerts the moment something goes down.
- Secure by default. Sign-in goes through Microsoft 365, and the payment flow had its own security review before it went live.
- Managed devices. The shop’s computers are enrolled in device management, encrypted and held to compliance policies.
BEYOND THE SOFTWARE
The building.
The same approach — own it, keep it simple, skip the subscription — carried into the facility itself: office signage, multi-zone audio and a live camera viewer, all on hardware the shop owns. That work has its own write-up.
BY THE NUMBERS
- 5 Months from design document to today
- ~88,000 Lines of application code
- 91 Database tables
- 106 Schema migrations shipped
- 250+ Commits to the current codebase
- 45+ Operations available to Claude through MCP
- 1,100+ Catalog items priced live
- ~37,500 Historical records being migrated
- ~17,000 Files being migrated
- 7 Internal apps and services built alongside
WHAT I LEARNED
-
Get the data model right, even if it means starting over.
The first quoting engine used a contractor-style markup waterfall. Once it was clear that most of the shop’s work is manufacturing, I rebuilt it around products and bills of materials. That rework paid for itself the day quotes started turning into production jobs with nothing re-entered.
-
Free has to actually work.
For address autocomplete I started with a free, open-data service to avoid another billing account. Its data wasn’t good enough for real install addresses, so I switched to Google Places — which costs effectively nothing at the shop’s volume. Cutting costs is the goal; cutting corners isn’t.
-
The team is the test suite.
The biggest improvements came from structured feedback rounds and an in-app bug and feature board. People who use the system every day find what a spec never will.
-
AI is a force multiplier, not a substitute for knowing the trade.
Building with Claude Code compressed months of development into weeks. But knowing how a channel letter is priced, how a permit gets filed or how a shop floor actually moves still has to come from someone who’s done it. The guardrails matter, too: in CGSigns OS, AI can draft and prepare, but a person approves anything that touches a customer or money.
WHERE IT STANDS
In final testing, with cutover gated on readiness.
CGSigns OS is in final testing with the team, the migration pipeline is built and rehearsing, and cutover is gated on readiness rather than a date on the calendar. The infrastructure and facility systems are already in daily use.
The next phase moves deeper into the shop: tighter job costing against actual time and materials, more product calculators, and a jurisdiction-by-jurisdiction permitting reference that plugs into quoting.