Letterpress
WordPress
A publishing machine with a custom theme I design. Pages, posts, a real editor for non-developers.
The two machines
I build both. I will not flatter a stack because it is fashionable. The right machine is the one whose grain matches the job — so you are not fighting the CMS every Thursday, or paying custom-app prices for a brochure.
Letterpress
A publishing machine with a custom theme I design. Pages, posts, a real editor for non-developers.
Jig and mill
An application. Objects, roles, money with rules, the process only you have.
Staff will write. The important public things are pages and posts. You want a blog, a sermon archive, a menu, a case-study wall, a brochure that a human can extend without opening a terminal. WooCommerce is fine for a standard catalog. Membership plugins are fine for “pay to read.”
What I will not do: install a page-builder circus, a 40-plugin SEO suite, or a “multi-vendor marketplace” plugin and call it architecture. The theme is custom. The plugins are few and named.
Clients or staff log in and do work. The important thing is a record — a job, a property, a claim, a trip, a SKU with a formula. Money is not a donate button. Search is a product. Something has to sync with Square, QuickBooks, a desktop tool, a partner.
Laravel means I design the admin too. You do not get “just add a page” for free unless I build that. That is the trade: the data model is yours, the CMS convenience is not.
WordPress for the public story, Laravel for the logged-in work, same design language, two codebases that share a header and a login story. Heavier. Correct when marketing and the app have different editors and different cadences. I will say so on the quote if that is the grain.
WordPress is not “cheap Laravel.” Laravel is not “WordPress for grown-ups.” A $4,000 calling card does not become a portal because someone said API in a meeting. If the ticket is confused, I write back with the smaller true job — not a padded estimate.
Chooser
Six questions. A lean appears. It is not a quote and it is not a contract. Override it on the ticket if your gut disagrees — then tell me why in the notes.