Hi, I’m Luke Duff, a Sunderland-based web designer and IT consultant. I specialise in creating custom, user-friendly websites that help small businesses succeed online. With a deep understanding of local challenges, I offer personalised solutions to meet your unique needs. Let’s work together to bring your vision to life.
Contact Us


Client: Internal project · Luke Duff · Business Operations & Lead Generation Software
Running a small web design and development business means spending a surprising amount of time inside other people’s software. Client records in one tool, project notes in another, invoices somewhere else, spreadsheets holding the parts nothing else covered, and a scattering of freelance tools on top. Nothing talked to anything else, and every subscription was a monthly cost for a fraction of the features.
MYOS was built to replace all of it with one application. It handles the day-to-day running of the business — clients, projects, invoices, quotes, tasks, expenses, subscriptions and calendar — and it also generates work: finding leads, auditing their existing websites, scoring them, and drafting outreach messages ready to be reviewed and sent by hand.
Because it holds real client information, MYOS is deliberately local-only. It runs on one Mac, binds to localhost, stores everything in a single SQLite database on disk and never syncs to a cloud service. That constraint shaped the whole architecture. This case study covers the scope and the engineering decisions behind it — the application itself is not public and there is no live link.
| Problem | Solution Implemented |
|---|---|
| Business data spread across several unconnected subscription tools | Built a single Next.js 16 application over SQLite and Drizzle ORM, with a schema now past a hundred tables covering clients, projects, invoices, quotes, tasks, expenses, subscriptions, bank transactions and communications. Schema changes go through a versioned migration runner that checksums already-applied migrations and aborts on drift. |
| Client data could not safely sit in a hosted product | Made the app local-only by design — no cloud, no external auth, pinned to localhost, with the database file kept out of version control. Access is gated behind a rate-limited PIN screen with hashed tokens, and a maintained credential ledger records every secret, its scope and how to revoke it. |
| Automation that sends messages on your behalf is a real business risk | Wrote a hard product doctrine into the codebase: MYOS never sends an email automatically. Every send is a manual human click. Anything that would have been an automated email becomes a task with a draft body attached instead. The test suite enforces it too — send-route tests disable the mail transport before running and are built to fail safe, so a crashed test run leaves sending switched off rather than switched on. |
| Finding and qualifying new work was slow and manual | Built a lead pipeline that imports prospects, audits their websites with a server-side parser for SSL, mobile, SEO, conversion and design-age signals, grades them, and drafts personalised outreach for email, Instagram or WhatsApp — all queued as drafts for review, never sent automatically. |
| Ongoing client work needed monitoring that no single off-the-shelf tool covered | Added a set of purpose-built modules: a Website Intelligence engine running 63 deterministic rules over crawled pages behind an SSRF-guarded, DNS-pinned crawler; a WordPress fleet watchtower tracking versions, vulnerabilities, SSL and uptime across client sites; a visual breakage diff; an SEO command centre with rank tracking and index monitoring; a blog content engine; and a site builder that turns a brief into a structured intermediate format and then a deployable bundle. Findings from any of them become tasks. |
| AI features could easily turn into an unpredictable monthly bill | Made local models via Ollama the default path so the standard cost is £0, with paid models as a per-job opt-in. Every generation writes to a cost ledger, builds carry a per-build cost, and a monthly cap stops spend running away unnoticed. |